diff options
author | unknown <marko@hundin.mysql.fi> | 2005-04-27 12:28:44 +0300 |
---|---|---|
committer | unknown <marko@hundin.mysql.fi> | 2005-04-27 12:28:44 +0300 |
commit | 949112c12a2a74555c5049aa8b82cee87660cbb5 (patch) | |
tree | f5c1075fcd5b897aa5c2d97fe24ea10e85c5bba0 | |
parent | 4a3a46af13ae0703f590ac058fc1df61aeb946b6 (diff) | |
download | mariadb-git-949112c12a2a74555c5049aa8b82cee87660cbb5.tar.gz |
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.
-rw-r--r-- | innobase/btr/btr0btr.c | 9 | ||||
-rw-r--r-- | innobase/btr/btr0cur.c | 22 | ||||
-rw-r--r-- | innobase/include/page0page.ic | 2 | ||||
-rw-r--r-- | innobase/include/rem0rec.h | 6 | ||||
-rw-r--r-- | innobase/include/rem0rec.ic | 19 | ||||
-rw-r--r-- | innobase/rem/rem0rec.c | 9 | ||||
-rw-r--r-- | innobase/row/row0sel.c | 2 | ||||
-rw-r--r-- | innobase/row/row0vers.c | 4 |
8 files changed, 37 insertions, 36 deletions
diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index 75c99e04f7b..6ca0077523f 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -1273,17 +1273,20 @@ btr_page_get_sure_split_rec( supremum record of page */ if (rec == ins_rec) { - next_rec = NULL; + rec = NULL; + goto func_exit; } else if (rec == NULL) { next_rec = page_rec_get_next(ins_rec); } else { 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; } } + func_exit: if (UNIV_LIKELY_NULL(heap)) { mem_heap_free(heap); } @@ -1323,7 +1326,7 @@ btr_page_insert_fits( ut_ad(!split_rec == !offsets); ut_ad(!offsets - || page_is_comp(page) == !!rec_offs_comp(offsets)); + || !page_is_comp(page) == !rec_offs_comp(offsets)); ut_ad(!offsets || rec_offs_validate(split_rec, cursor->index, offsets)); diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index 4a68ef1d42e..a3f071c7729 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -1426,7 +1426,7 @@ btr_cur_update_in_place( rec_t* rec; dulint roll_ptr = ut_dulint_zero; trx_t* trx; - ibool was_delete_marked; + ulint was_delete_marked; mem_heap_t* heap = NULL; ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets = offsets_; @@ -1434,6 +1434,7 @@ btr_cur_update_in_place( rec = btr_cur_get_rec(cursor); index = cursor->index; + ut_ad(!!page_rec_is_comp(rec) == index->table->comp); trx = thr_get_trx(thr); offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); @@ -1547,6 +1548,7 @@ btr_cur_optimistic_update( page = btr_cur_get_page(cursor); rec = btr_cur_get_rec(cursor); index = cursor->index; + ut_ad(!!page_rec_is_comp(rec) == index->table->comp); heap = mem_heap_create(1024); offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap); @@ -1596,8 +1598,8 @@ btr_cur_optimistic_update( old_rec_size = rec_offs_size(offsets); new_rec_size = rec_get_converted_size(index, new_entry); - if (new_rec_size >= - page_get_free_space_of_empty(page_is_comp(page)) / 2) { + if (UNIV_UNLIKELY(new_rec_size >= page_get_free_space_of_empty( + page_is_comp(page)) / 2)) { mem_heap_free(heap); @@ -1607,8 +1609,9 @@ btr_cur_optimistic_update( max_size = old_rec_size + page_get_max_insert_size_after_reorganize(page, 1); - if (page_get_data_size(page) - old_rec_size + new_rec_size - < BTR_CUR_PAGE_COMPRESS_LIMIT) { + if (UNIV_UNLIKELY(page_get_data_size(page) + - old_rec_size + new_rec_size + < BTR_CUR_PAGE_COMPRESS_LIMIT)) { /* The page would become too empty */ @@ -2034,14 +2037,14 @@ btr_cur_parse_del_mark_set_clust_rec( page_t* page) /* in: page or NULL */ { ulint flags; - ibool val; + ulint val; ulint pos; dulint trx_id; dulint roll_ptr; ulint offset; 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) { @@ -2127,6 +2130,7 @@ btr_cur_del_mark_set_clust_rec( rec = btr_cur_get_rec(cursor); index = cursor->index; + ut_ad(!!page_rec_is_comp(rec) == index->table->comp); offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); if (btr_cur_print_record_ops && thr) { @@ -2135,7 +2139,7 @@ btr_cur_del_mark_set_clust_rec( } 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, rec, index, offsets, thr); @@ -2230,7 +2234,7 @@ btr_cur_parse_del_mark_set_sec_rec( byte* end_ptr,/* in: buffer end */ page_t* page) /* in: page or NULL */ { - ibool val; + ulint val; ulint offset; rec_t* rec; diff --git a/innobase/include/page0page.ic b/innobase/include/page0page.ic index 8299d160b28..cef8f6a1b80 100644 --- a/innobase/include/page0page.ic +++ b/innobase/include/page0page.ic @@ -593,10 +593,10 @@ page_rec_set_next( ut_ad(page_rec_check(rec)); ut_ad(!page_rec_is_supremum(rec)); - ut_ad(!page_rec_is_infimum(next)); page = ut_align_down(rec, UNIV_PAGE_SIZE); if (next) { + ut_ad(!page_rec_is_infimum(next)); ut_a(page == ut_align_down(next, UNIV_PAGE_SIZE)); offs = (ulint) (next - page); } else { diff --git a/innobase/include/rem0rec.h b/innobase/include/rem0rec.h index 3c150d6601d..bfb43847e39 100644 --- a/innobase/include/rem0rec.h +++ b/innobase/include/rem0rec.h @@ -162,10 +162,10 @@ rec_set_info_and_status_bits( /********************************************************** The following function tells if record is delete marked. */ UNIV_INLINE -ibool +ulint rec_get_deleted_flag( /*=================*/ - /* out: TRUE if delete marked */ + /* out: nonzero if delete marked */ rec_t* rec, /* in: physical record */ ulint comp); /* in: nonzero=compact page format */ /********************************************************** @@ -176,7 +176,7 @@ rec_set_deleted_flag( /*=================*/ rec_t* rec, /* in: physical record */ 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. */ UNIV_INLINE diff --git a/innobase/include/rem0rec.ic b/innobase/include/rem0rec.ic index 85e196bbcf8..3ada4100bd0 100644 --- a/innobase/include/rem0rec.ic +++ b/innobase/include/rem0rec.ic @@ -578,19 +578,21 @@ rec_set_info_and_status_bits( /********************************************************** The following function tells if record is delete marked. */ UNIV_INLINE -ibool +ulint rec_get_deleted_flag( /*=================*/ - /* out: TRUE if delete marked */ + /* out: nonzero if delete marked */ rec_t* rec, /* in: physical record */ ulint comp) /* in: nonzero=compact page format */ { if (UNIV_EXPECT(comp, REC_OFFS_COMPACT)) { - return(0 != rec_get_bit_field_1(rec, REC_NEW_INFO_BITS, - REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT)); + return(UNIV_UNLIKELY(rec_get_bit_field_1(rec, + REC_NEW_INFO_BITS, REC_INFO_DELETED_FLAG, + REC_INFO_BITS_SHIFT))); } else { - return(0 != rec_get_bit_field_1(rec, REC_OLD_INFO_BITS, - REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT)); + return(UNIV_UNLIKELY(rec_get_bit_field_1(rec, + REC_OLD_INFO_BITS, REC_INFO_DELETED_FLAG, + REC_INFO_BITS_SHIFT))); } } @@ -602,13 +604,10 @@ rec_set_deleted_flag( /*=================*/ rec_t* rec, /* in: physical record */ ulint comp, /* in: nonzero=compact page format */ - ibool flag) /* in: TRUE if delete marked */ + ulint flag) /* in: nonzero if delete marked */ { ulint val; - ut_ad(TRUE == 1); - ut_ad(flag <= TRUE); - val = rec_get_info_bits(rec, comp); if (flag) { diff --git a/innobase/rem/rem0rec.c b/innobase/rem/rem0rec.c index a1e7e348781..580a7bfe509 100644 --- a/innobase/rem/rem0rec.c +++ b/innobase/rem/rem0rec.c @@ -218,20 +218,15 @@ rec_init_offsets( We do not advance offs, and we set the length to zero and enable the SQL NULL flag in offsets[]. */ - len = REC_OFFS_SQL_NULL; + len = offs | REC_OFFS_SQL_NULL; goto resolved; } null_mask <<= 1; - - ut_ad(!field->fixed_len); - goto variable_length; } if (UNIV_UNLIKELY(!field->fixed_len)) { - dtype_t* type; - variable_length: /* Variable-length field: read the length */ - type = dict_col_get_type( + dtype_t* type = dict_col_get_type( dict_field_get_col(field)); len = *lens--; if (UNIV_UNLIKELY(dtype_get_len(type) > 255) diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c index c2f9e79ca65..a2257e0b72e 100644 --- a/innobase/row/row0sel.c +++ b/innobase/row/row0sel.c @@ -3459,7 +3459,7 @@ rec_loop: /* PHASE 4: Look for matching records in a loop */ 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 /* fputs("Using ", stderr); diff --git a/innobase/row/row0vers.c b/innobase/row/row0vers.c index 68231f6eade..8e747423047 100644 --- a/innobase/row/row0vers.c +++ b/innobase/row/row0vers.c @@ -57,8 +57,8 @@ row_vers_impl_x_locked_off_kernel( dtuple_t* entry = NULL; /* assignment to eliminate compiler warning */ trx_t* trx; - ibool vers_del; - ibool rec_del; + ulint vers_del; + ulint rec_del; ulint err; mtr_t mtr; ulint comp; |