Commit 949112c1 authored by unknown's avatar unknown

Fix bugs found in previous optimizations.

Make rec_get_deleted_flag() return zero/nonzero instead of FALSE/TRUE.


innobase/btr/btr0btr.c:
  btr_page_get_sure_split_rec(): Fix bug caused by optimization
  (dereferencing null pointer in page_rec_is_supremum())
  btr_page_insert_fits(): Correct a debug assertion.
innobase/btr/btr0cur.c:
  Add debug assertions about page_rec_is_comp().
  Add UNIV_LIKELY and UNIV_UNLIKELY hints.
  Note that rec_get_deleted_flag() returns zero/nonzero ulint
  instead of FALSE/TRUE ibool.
innobase/include/page0page.ic:
  Move debug assertion to proper place.
innobase/include/rem0rec.h:
  rec_get_deleted_flag(), rec_set_deleted_flag(): Make the flag
  zero/nonzero in order to avoid FALSE/TRUE normalization in
  every rec_get_deleted_flag() call.
innobase/include/rem0rec.ic:
  rec_get_deleted_flag(), rec_set_deleted_flag(): Make the flag
  zero/nonzero in order to avoid FALSE/TRUE normalization in
  every rec_get_deleted_flag() call.
innobase/rem/rem0rec.c:
  rec_init_offsets(): Fix bugs introduced in optimization.
innobase/row/row0sel.c:
  Make debug assertion stricter.
innobase/row/row0vers.c:
  Note that rec_get_deleted_flag() returns zero/nonzero ulint
  instead of FALSE/TRUE ibool.
parent 4a3a46af
...@@ -1273,17 +1273,20 @@ btr_page_get_sure_split_rec( ...@@ -1273,17 +1273,20 @@ btr_page_get_sure_split_rec(
supremum record of page */ supremum record of page */
if (rec == ins_rec) { if (rec == ins_rec) {
next_rec = NULL; rec = NULL;
goto func_exit;
} else if (rec == NULL) { } else if (rec == NULL) {
next_rec = page_rec_get_next(ins_rec); next_rec = page_rec_get_next(ins_rec);
} else { } else {
next_rec = page_rec_get_next(rec); next_rec = page_rec_get_next(rec);
} }
if (!page_rec_is_supremum(next_rec))) { ut_ad(next_rec);
if (!page_rec_is_supremum(next_rec)) {
rec = next_rec; rec = next_rec;
} }
} }
func_exit:
if (UNIV_LIKELY_NULL(heap)) { if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap); mem_heap_free(heap);
} }
...@@ -1323,7 +1326,7 @@ btr_page_insert_fits( ...@@ -1323,7 +1326,7 @@ btr_page_insert_fits(
ut_ad(!split_rec == !offsets); ut_ad(!split_rec == !offsets);
ut_ad(!offsets ut_ad(!offsets
|| page_is_comp(page) == !!rec_offs_comp(offsets)); || !page_is_comp(page) == !rec_offs_comp(offsets));
ut_ad(!offsets ut_ad(!offsets
|| rec_offs_validate(split_rec, cursor->index, offsets)); || rec_offs_validate(split_rec, cursor->index, offsets));
......
...@@ -1426,7 +1426,7 @@ btr_cur_update_in_place( ...@@ -1426,7 +1426,7 @@ btr_cur_update_in_place(
rec_t* rec; rec_t* rec;
dulint roll_ptr = ut_dulint_zero; dulint roll_ptr = ut_dulint_zero;
trx_t* trx; trx_t* trx;
ibool was_delete_marked; ulint was_delete_marked;
mem_heap_t* heap = NULL; mem_heap_t* heap = NULL;
ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets = offsets_; ulint* offsets = offsets_;
...@@ -1434,6 +1434,7 @@ btr_cur_update_in_place( ...@@ -1434,6 +1434,7 @@ btr_cur_update_in_place(
rec = btr_cur_get_rec(cursor); rec = btr_cur_get_rec(cursor);
index = cursor->index; index = cursor->index;
ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
trx = thr_get_trx(thr); trx = thr_get_trx(thr);
offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);
...@@ -1547,6 +1548,7 @@ btr_cur_optimistic_update( ...@@ -1547,6 +1548,7 @@ btr_cur_optimistic_update(
page = btr_cur_get_page(cursor); page = btr_cur_get_page(cursor);
rec = btr_cur_get_rec(cursor); rec = btr_cur_get_rec(cursor);
index = cursor->index; index = cursor->index;
ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
heap = mem_heap_create(1024); heap = mem_heap_create(1024);
offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap); offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
...@@ -1596,8 +1598,8 @@ btr_cur_optimistic_update( ...@@ -1596,8 +1598,8 @@ btr_cur_optimistic_update(
old_rec_size = rec_offs_size(offsets); old_rec_size = rec_offs_size(offsets);
new_rec_size = rec_get_converted_size(index, new_entry); new_rec_size = rec_get_converted_size(index, new_entry);
if (new_rec_size >= if (UNIV_UNLIKELY(new_rec_size >= page_get_free_space_of_empty(
page_get_free_space_of_empty(page_is_comp(page)) / 2) { page_is_comp(page)) / 2)) {
mem_heap_free(heap); mem_heap_free(heap);
...@@ -1607,8 +1609,9 @@ btr_cur_optimistic_update( ...@@ -1607,8 +1609,9 @@ btr_cur_optimistic_update(
max_size = old_rec_size max_size = old_rec_size
+ page_get_max_insert_size_after_reorganize(page, 1); + page_get_max_insert_size_after_reorganize(page, 1);
if (page_get_data_size(page) - old_rec_size + new_rec_size if (UNIV_UNLIKELY(page_get_data_size(page)
< BTR_CUR_PAGE_COMPRESS_LIMIT) { - old_rec_size + new_rec_size
< BTR_CUR_PAGE_COMPRESS_LIMIT)) {
/* The page would become too empty */ /* The page would become too empty */
...@@ -2034,14 +2037,14 @@ btr_cur_parse_del_mark_set_clust_rec( ...@@ -2034,14 +2037,14 @@ btr_cur_parse_del_mark_set_clust_rec(
page_t* page) /* in: page or NULL */ page_t* page) /* in: page or NULL */
{ {
ulint flags; ulint flags;
ibool val; ulint val;
ulint pos; ulint pos;
dulint trx_id; dulint trx_id;
dulint roll_ptr; dulint roll_ptr;
ulint offset; ulint offset;
rec_t* rec; rec_t* rec;
ut_ad(!!page_is_comp(page) == index->table->comp); ut_ad(!page || !!page_is_comp(page) == index->table->comp);
if (end_ptr < ptr + 2) { if (end_ptr < ptr + 2) {
...@@ -2127,6 +2130,7 @@ btr_cur_del_mark_set_clust_rec( ...@@ -2127,6 +2130,7 @@ btr_cur_del_mark_set_clust_rec(
rec = btr_cur_get_rec(cursor); rec = btr_cur_get_rec(cursor);
index = cursor->index; index = cursor->index;
ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);
if (btr_cur_print_record_ops && thr) { if (btr_cur_print_record_ops && thr) {
...@@ -2135,7 +2139,7 @@ btr_cur_del_mark_set_clust_rec( ...@@ -2135,7 +2139,7 @@ btr_cur_del_mark_set_clust_rec(
} }
ut_ad(index->type & DICT_CLUSTERED); ut_ad(index->type & DICT_CLUSTERED);
ut_ad(rec_get_deleted_flag(rec, index->table->comp) == FALSE); ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));
err = lock_clust_rec_modify_check_and_lock(flags, err = lock_clust_rec_modify_check_and_lock(flags,
rec, index, offsets, thr); rec, index, offsets, thr);
...@@ -2230,7 +2234,7 @@ btr_cur_parse_del_mark_set_sec_rec( ...@@ -2230,7 +2234,7 @@ btr_cur_parse_del_mark_set_sec_rec(
byte* end_ptr,/* in: buffer end */ byte* end_ptr,/* in: buffer end */
page_t* page) /* in: page or NULL */ page_t* page) /* in: page or NULL */
{ {
ibool val; ulint val;
ulint offset; ulint offset;
rec_t* rec; rec_t* rec;
......
...@@ -593,10 +593,10 @@ page_rec_set_next( ...@@ -593,10 +593,10 @@ page_rec_set_next(
ut_ad(page_rec_check(rec)); ut_ad(page_rec_check(rec));
ut_ad(!page_rec_is_supremum(rec)); ut_ad(!page_rec_is_supremum(rec));
ut_ad(!page_rec_is_infimum(next));
page = ut_align_down(rec, UNIV_PAGE_SIZE); page = ut_align_down(rec, UNIV_PAGE_SIZE);
if (next) { if (next) {
ut_ad(!page_rec_is_infimum(next));
ut_a(page == ut_align_down(next, UNIV_PAGE_SIZE)); ut_a(page == ut_align_down(next, UNIV_PAGE_SIZE));
offs = (ulint) (next - page); offs = (ulint) (next - page);
} else { } else {
......
...@@ -162,10 +162,10 @@ rec_set_info_and_status_bits( ...@@ -162,10 +162,10 @@ rec_set_info_and_status_bits(
/********************************************************** /**********************************************************
The following function tells if record is delete marked. */ The following function tells if record is delete marked. */
UNIV_INLINE UNIV_INLINE
ibool ulint
rec_get_deleted_flag( rec_get_deleted_flag(
/*=================*/ /*=================*/
/* out: TRUE if delete marked */ /* out: nonzero if delete marked */
rec_t* rec, /* in: physical record */ rec_t* rec, /* in: physical record */
ulint comp); /* in: nonzero=compact page format */ ulint comp); /* in: nonzero=compact page format */
/********************************************************** /**********************************************************
...@@ -176,7 +176,7 @@ rec_set_deleted_flag( ...@@ -176,7 +176,7 @@ rec_set_deleted_flag(
/*=================*/ /*=================*/
rec_t* rec, /* in: physical record */ rec_t* rec, /* in: physical record */
ulint comp, /* in: nonzero=compact page format */ ulint comp, /* in: nonzero=compact page format */
ibool flag); /* in: TRUE if delete marked */ ulint flag); /* in: nonzero if delete marked */
/********************************************************** /**********************************************************
The following function tells if a new-style record is a node pointer. */ The following function tells if a new-style record is a node pointer. */
UNIV_INLINE UNIV_INLINE
......
...@@ -578,19 +578,21 @@ rec_set_info_and_status_bits( ...@@ -578,19 +578,21 @@ rec_set_info_and_status_bits(
/********************************************************** /**********************************************************
The following function tells if record is delete marked. */ The following function tells if record is delete marked. */
UNIV_INLINE UNIV_INLINE
ibool ulint
rec_get_deleted_flag( rec_get_deleted_flag(
/*=================*/ /*=================*/
/* out: TRUE if delete marked */ /* out: nonzero if delete marked */
rec_t* rec, /* in: physical record */ rec_t* rec, /* in: physical record */
ulint comp) /* in: nonzero=compact page format */ ulint comp) /* in: nonzero=compact page format */
{ {
if (UNIV_EXPECT(comp, REC_OFFS_COMPACT)) { if (UNIV_EXPECT(comp, REC_OFFS_COMPACT)) {
return(0 != rec_get_bit_field_1(rec, REC_NEW_INFO_BITS, return(UNIV_UNLIKELY(rec_get_bit_field_1(rec,
REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT)); REC_NEW_INFO_BITS, REC_INFO_DELETED_FLAG,
REC_INFO_BITS_SHIFT)));
} else { } else {
return(0 != rec_get_bit_field_1(rec, REC_OLD_INFO_BITS, return(UNIV_UNLIKELY(rec_get_bit_field_1(rec,
REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT)); REC_OLD_INFO_BITS, REC_INFO_DELETED_FLAG,
REC_INFO_BITS_SHIFT)));
} }
} }
...@@ -602,13 +604,10 @@ rec_set_deleted_flag( ...@@ -602,13 +604,10 @@ rec_set_deleted_flag(
/*=================*/ /*=================*/
rec_t* rec, /* in: physical record */ rec_t* rec, /* in: physical record */
ulint comp, /* in: nonzero=compact page format */ ulint comp, /* in: nonzero=compact page format */
ibool flag) /* in: TRUE if delete marked */ ulint flag) /* in: nonzero if delete marked */
{ {
ulint val; ulint val;
ut_ad(TRUE == 1);
ut_ad(flag <= TRUE);
val = rec_get_info_bits(rec, comp); val = rec_get_info_bits(rec, comp);
if (flag) { if (flag) {
......
...@@ -218,20 +218,15 @@ rec_init_offsets( ...@@ -218,20 +218,15 @@ rec_init_offsets(
We do not advance offs, and we set We do not advance offs, and we set
the length to zero and enable the the length to zero and enable the
SQL NULL flag in offsets[]. */ SQL NULL flag in offsets[]. */
len = REC_OFFS_SQL_NULL; len = offs | REC_OFFS_SQL_NULL;
goto resolved; goto resolved;
} }
null_mask <<= 1; null_mask <<= 1;
ut_ad(!field->fixed_len);
goto variable_length;
} }
if (UNIV_UNLIKELY(!field->fixed_len)) { if (UNIV_UNLIKELY(!field->fixed_len)) {
dtype_t* type;
variable_length:
/* Variable-length field: read the length */ /* Variable-length field: read the length */
type = dict_col_get_type( dtype_t* type = dict_col_get_type(
dict_field_get_col(field)); dict_field_get_col(field));
len = *lens--; len = *lens--;
if (UNIV_UNLIKELY(dtype_get_len(type) > 255) if (UNIV_UNLIKELY(dtype_get_len(type) > 255)
......
...@@ -3459,7 +3459,7 @@ row_search_for_mysql( ...@@ -3459,7 +3459,7 @@ row_search_for_mysql(
/* PHASE 4: Look for matching records in a loop */ /* PHASE 4: Look for matching records in a loop */
rec = btr_pcur_get_rec(pcur); rec = btr_pcur_get_rec(pcur);
ut_ad(!page_rec_is_comp(rec) == !index->table->comp); ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
#ifdef UNIV_SEARCH_DEBUG #ifdef UNIV_SEARCH_DEBUG
/* /*
fputs("Using ", stderr); fputs("Using ", stderr);
......
...@@ -57,8 +57,8 @@ row_vers_impl_x_locked_off_kernel( ...@@ -57,8 +57,8 @@ row_vers_impl_x_locked_off_kernel(
dtuple_t* entry = NULL; /* assignment to eliminate compiler dtuple_t* entry = NULL; /* assignment to eliminate compiler
warning */ warning */
trx_t* trx; trx_t* trx;
ibool vers_del; ulint vers_del;
ibool rec_del; ulint rec_del;
ulint err; ulint err;
mtr_t mtr; mtr_t mtr;
ulint comp; ulint comp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment