Commit 8452057e authored by unknown's avatar unknown

InnoDB: Fix some bugs in the new record format. (Bug #7493)


innobase/btr/btr0btr.c:
  Remove parameter n_fields from cmp_rec_rec()
innobase/btr/btr0cur.c:
  Remove parameter n_fields from cmp_rec_rec_with_match()
innobase/btr/btr0pcur.c:
  Remove parameter n_fields from cmp_rec_rec()
innobase/include/rem0cmp.h:
  Remove parameter n from cmp_rec_rec_with_match() and cmp_rec_rec()
innobase/include/rem0cmp.ic:
  Remove parameter n from cmp_rec_rec()
innobase/include/rem0rec.ic:
  Correct the implementation of rec_offs_nth_size() (Bug #7493)
innobase/page/page0page.c:
  Remove parameter n_fields from cmp_rec_rec()
innobase/rem/rem0cmp.c:
  Remove parameter n from cmp_rec_rec_with_match()
innobase/rem/rem0rec.c:
  rec_get_offsets(): Pass the number of allocated elements to
  rec_offs_set_n_alloc() instead of the number of allocated bytes,
  so that debugging assertions are more likely to detect
  out-of-bounds errors.
parent 412b601a
...@@ -2735,9 +2735,8 @@ btr_validate_level( ...@@ -2735,9 +2735,8 @@ btr_validate_level(
offsets, ULINT_UNDEFINED, &heap); offsets, ULINT_UNDEFINED, &heap);
offsets2 = rec_get_offsets(right_rec, index, offsets2 = rec_get_offsets(right_rec, index,
offsets2, ULINT_UNDEFINED, &heap); offsets2, ULINT_UNDEFINED, &heap);
if (cmp_rec_rec(rec, right_rec, offsets, offsets2, if (cmp_rec_rec(rec, right_rec, offsets, offsets2, index)
dict_index_get_n_fields(index), >= 0) {
index) >= 0) {
btr_validate_report2(index, level, page, right_page); btr_validate_report2(index, level, page, right_page);
......
...@@ -2848,7 +2848,7 @@ btr_estimate_number_of_different_key_vals( ...@@ -2848,7 +2848,7 @@ btr_estimate_number_of_different_key_vals(
cmp_rec_rec_with_match(rec, next_rec, cmp_rec_rec_with_match(rec, next_rec,
offsets1, offsets2, offsets1, offsets2,
index, n_cols, &matched_fields, index, &matched_fields,
&matched_bytes); &matched_bytes);
for (j = matched_fields + 1; j <= n_cols; j++) { for (j = matched_fields + 1; j <= n_cols; j++) {
......
...@@ -268,9 +268,7 @@ btr_pcur_restore_position( ...@@ -268,9 +268,7 @@ btr_pcur_restore_position(
cursor->old_n_fields, &heap); cursor->old_n_fields, &heap);
ut_ad(cmp_rec_rec(cursor->old_rec, ut_ad(cmp_rec_rec(cursor->old_rec,
rec, offsets1, offsets2, rec, offsets1, offsets2, index) == 0);
cursor->old_n_fields,
index) == 0);
mem_heap_free(heap); mem_heap_free(heap);
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
return(TRUE); return(TRUE);
......
...@@ -137,10 +137,6 @@ cmp_rec_rec_with_match( ...@@ -137,10 +137,6 @@ cmp_rec_rec_with_match(
const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */
const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */
dict_index_t* index, /* in: data dictionary index */ dict_index_t* index, /* in: data dictionary index */
ulint n, /* in: number of fields to compare,
or ULINT_UNDEFINED if both records
contain all fields, and all fields
should be compared */
ulint* matched_fields, /* in/out: number of already completely ulint* matched_fields, /* in/out: number of already completely
matched fields; when the function returns, matched fields; when the function returns,
contains the value the for current contains the value the for current
...@@ -163,10 +159,6 @@ cmp_rec_rec( ...@@ -163,10 +159,6 @@ cmp_rec_rec(
rec_t* rec2, /* in: physical record */ rec_t* rec2, /* in: physical record */
const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */
const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */
ulint n, /* in: number of fields to compare,
or ULINT_UNDEFINED if both records
contain all fields, and all fields
should be compared */
dict_index_t* index); /* in: data dictionary index */ dict_index_t* index); /* in: data dictionary index */
......
...@@ -59,12 +59,11 @@ cmp_rec_rec( ...@@ -59,12 +59,11 @@ cmp_rec_rec(
rec_t* rec2, /* in: physical record */ rec_t* rec2, /* in: physical record */
const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */
const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */
ulint n, /* in: number of fields to compare */
dict_index_t* index) /* in: data dictionary index */ dict_index_t* index) /* in: data dictionary index */
{ {
ulint match_f = 0; ulint match_f = 0;
ulint match_b = 0; ulint match_b = 0;
return(cmp_rec_rec_with_match(rec1, rec2, offsets1, offsets2, index, n, return(cmp_rec_rec_with_match(rec1, rec2, offsets1, offsets2, index,
&match_f, &match_b)); &match_f, &match_b));
} }
...@@ -946,7 +946,8 @@ rec_offs_nth_size( ...@@ -946,7 +946,8 @@ rec_offs_nth_size(
{ {
ut_ad(rec_offs_validate(NULL, NULL, offsets)); ut_ad(rec_offs_validate(NULL, NULL, offsets));
ut_ad(n < rec_offs_n_fields(offsets)); ut_ad(n < rec_offs_n_fields(offsets));
return(rec_offs_base(offsets)[1 + n] & REC_OFFS_MASK); return((rec_offs_base(offsets)[1 + n] - rec_offs_base(offsets)[n])
& REC_OFFS_MASK);
} }
/********************************************************** /**********************************************************
......
...@@ -1749,8 +1749,7 @@ page_validate( ...@@ -1749,8 +1749,7 @@ page_validate(
/* Check that the records are in the ascending order */ /* Check that the records are in the ascending order */
if ((count >= 2) && (!page_cur_is_after_last(&cur))) { if ((count >= 2) && (!page_cur_is_after_last(&cur))) {
if (!(1 == cmp_rec_rec(rec, old_rec, if (!(1 == cmp_rec_rec(rec, old_rec,
offsets, old_offsets, offsets, old_offsets, index))) {
ULINT_UNDEFINED, index))) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Records in wrong order on page %lu", "InnoDB: Records in wrong order on page %lu",
(ulong) buf_frame_get_page_no(page)); (ulong) buf_frame_get_page_no(page));
......
...@@ -728,10 +728,6 @@ cmp_rec_rec_with_match( ...@@ -728,10 +728,6 @@ cmp_rec_rec_with_match(
const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */
const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, index) */
dict_index_t* index, /* in: data dictionary index */ dict_index_t* index, /* in: data dictionary index */
ulint n, /* in: number of fields to compare,
or ULINT_UNDEFINED if both records
contain all fields, and all fields
should be compared */
ulint* matched_fields, /* in/out: number of already completely ulint* matched_fields, /* in/out: number of already completely
matched fields; when the function returns, matched fields; when the function returns,
contains the value the for current contains the value the for current
...@@ -765,14 +761,8 @@ cmp_rec_rec_with_match( ...@@ -765,14 +761,8 @@ cmp_rec_rec_with_match(
ut_ad(rec_offs_comp(offsets1) == rec_offs_comp(offsets2)); ut_ad(rec_offs_comp(offsets1) == rec_offs_comp(offsets2));
comp = rec_offs_comp(offsets1); comp = rec_offs_comp(offsets1);
if (n == ULINT_UNDEFINED) { rec1_n_fields = rec_offs_n_fields(offsets1);
rec1_n_fields = rec_offs_n_fields(offsets1); rec2_n_fields = rec_offs_n_fields(offsets2);
rec2_n_fields = rec_offs_n_fields(offsets2);
} else {
ut_ad(n <= rec_offs_n_fields(offsets1));
ut_ad(n <= rec_offs_n_fields(offsets2));
rec1_n_fields = rec2_n_fields = n;
}
cur_field = *matched_fields; cur_field = *matched_fields;
cur_bytes = *matched_bytes; cur_bytes = *matched_bytes;
......
...@@ -333,14 +333,14 @@ rec_get_offsets_func( ...@@ -333,14 +333,14 @@ rec_get_offsets_func(
n = n_fields; n = n_fields;
} }
size = (n + (1 + REC_OFFS_HEADER_SIZE)) * sizeof(ulint); size = n + (1 + REC_OFFS_HEADER_SIZE);
if (!offsets || rec_offs_get_n_alloc(offsets) < size) { if (!offsets || rec_offs_get_n_alloc(offsets) < size) {
if (!*heap) { if (!*heap) {
*heap = mem_heap_create_func(size, *heap = mem_heap_create_func(size * sizeof(ulint),
NULL, MEM_HEAP_DYNAMIC, file, line); NULL, MEM_HEAP_DYNAMIC, file, line);
} }
offsets = mem_heap_alloc(*heap, size); offsets = mem_heap_alloc(*heap, size * sizeof(ulint));
rec_offs_set_n_alloc(offsets, size); rec_offs_set_n_alloc(offsets, size);
} }
......
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