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(
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));
......
......@@ -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;
......
......@@ -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 {
......
......@@ -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
......
......@@ -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) {
......
......@@ -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)
......
......@@ -3459,7 +3459,7 @@ row_search_for_mysql(
/* 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);
......
......@@ -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;
......
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