diff options
author | unknown <marko@hundin.mysql.fi> | 2004-12-28 01:34:52 +0200 |
---|---|---|
committer | unknown <marko@hundin.mysql.fi> | 2004-12-28 01:34:52 +0200 |
commit | 7ce58befd33d78e1c11872fcbc696a9cfad698c2 (patch) | |
tree | 6da5ac10b2bcc95fc1120e9a5d69928fdbe40917 | |
parent | e3c7697431c144215af2f752d5c23b5b06e29982 (diff) | |
download | mariadb-git-7ce58befd33d78e1c11872fcbc696a9cfad698c2.tar.gz |
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.
-rw-r--r-- | innobase/btr/btr0btr.c | 5 | ||||
-rw-r--r-- | innobase/btr/btr0cur.c | 2 | ||||
-rw-r--r-- | innobase/btr/btr0pcur.c | 4 | ||||
-rw-r--r-- | innobase/include/rem0cmp.h | 8 | ||||
-rw-r--r-- | innobase/include/rem0cmp.ic | 3 | ||||
-rw-r--r-- | innobase/include/rem0rec.ic | 3 | ||||
-rw-r--r-- | innobase/page/page0page.c | 3 | ||||
-rw-r--r-- | innobase/rem/rem0cmp.c | 14 | ||||
-rw-r--r-- | innobase/rem/rem0rec.c | 6 |
9 files changed, 13 insertions, 35 deletions
diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index 9da422e927f..4fb930da50f 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -2735,9 +2735,8 @@ loop: offsets, ULINT_UNDEFINED, &heap); offsets2 = rec_get_offsets(right_rec, index, offsets2, ULINT_UNDEFINED, &heap); - if (cmp_rec_rec(rec, right_rec, offsets, offsets2, - dict_index_get_n_fields(index), - index) >= 0) { + if (cmp_rec_rec(rec, right_rec, offsets, offsets2, index) + >= 0) { btr_validate_report2(index, level, page, right_page); diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index a3083e0e545..4c2a501a08a 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -2848,7 +2848,7 @@ btr_estimate_number_of_different_key_vals( cmp_rec_rec_with_match(rec, next_rec, offsets1, offsets2, - index, n_cols, &matched_fields, + index, &matched_fields, &matched_bytes); for (j = matched_fields + 1; j <= n_cols; j++) { diff --git a/innobase/btr/btr0pcur.c b/innobase/btr/btr0pcur.c index ad7613e0655..ceaa4f41a18 100644 --- a/innobase/btr/btr0pcur.c +++ b/innobase/btr/btr0pcur.c @@ -268,9 +268,7 @@ btr_pcur_restore_position( cursor->old_n_fields, &heap); ut_ad(cmp_rec_rec(cursor->old_rec, - rec, offsets1, offsets2, - cursor->old_n_fields, - index) == 0); + rec, offsets1, offsets2, index) == 0); mem_heap_free(heap); #endif /* UNIV_DEBUG */ return(TRUE); diff --git a/innobase/include/rem0cmp.h b/innobase/include/rem0cmp.h index 77a5a42c2d5..1b1ee26b809 100644 --- a/innobase/include/rem0cmp.h +++ b/innobase/include/rem0cmp.h @@ -137,10 +137,6 @@ cmp_rec_rec_with_match( const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, 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 matched fields; when the function returns, contains the value the for current @@ -163,10 +159,6 @@ cmp_rec_rec( rec_t* rec2, /* in: physical record */ const ulint* offsets1,/* in: rec_get_offsets(rec1, 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 */ diff --git a/innobase/include/rem0cmp.ic b/innobase/include/rem0cmp.ic index d4c30f25f03..b86534e0a6a 100644 --- a/innobase/include/rem0cmp.ic +++ b/innobase/include/rem0cmp.ic @@ -59,12 +59,11 @@ cmp_rec_rec( rec_t* rec2, /* in: physical record */ const ulint* offsets1,/* in: rec_get_offsets(rec1, 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 */ { ulint match_f = 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)); } diff --git a/innobase/include/rem0rec.ic b/innobase/include/rem0rec.ic index 2a1f8c8a0db..b9a79c259a4 100644 --- a/innobase/include/rem0rec.ic +++ b/innobase/include/rem0rec.ic @@ -946,7 +946,8 @@ rec_offs_nth_size( { ut_ad(rec_offs_validate(NULL, NULL, 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); } /********************************************************** diff --git a/innobase/page/page0page.c b/innobase/page/page0page.c index 67c7bd936d1..20bbfba7a50 100644 --- a/innobase/page/page0page.c +++ b/innobase/page/page0page.c @@ -1749,8 +1749,7 @@ page_validate( /* Check that the records are in the ascending order */ if ((count >= 2) && (!page_cur_is_after_last(&cur))) { if (!(1 == cmp_rec_rec(rec, old_rec, - offsets, old_offsets, - ULINT_UNDEFINED, index))) { + offsets, old_offsets, index))) { fprintf(stderr, "InnoDB: Records in wrong order on page %lu", (ulong) buf_frame_get_page_no(page)); diff --git a/innobase/rem/rem0cmp.c b/innobase/rem/rem0cmp.c index 974fc7a24d0..6473d356ba8 100644 --- a/innobase/rem/rem0cmp.c +++ b/innobase/rem/rem0cmp.c @@ -728,10 +728,6 @@ cmp_rec_rec_with_match( const ulint* offsets1,/* in: rec_get_offsets(rec1, index) */ const ulint* offsets2,/* in: rec_get_offsets(rec2, 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 matched fields; when the function returns, contains the value the for current @@ -765,14 +761,8 @@ cmp_rec_rec_with_match( ut_ad(rec_offs_comp(offsets1) == rec_offs_comp(offsets2)); comp = rec_offs_comp(offsets1); - if (n == ULINT_UNDEFINED) { - rec1_n_fields = rec_offs_n_fields(offsets1); - 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; - } + rec1_n_fields = rec_offs_n_fields(offsets1); + rec2_n_fields = rec_offs_n_fields(offsets2); cur_field = *matched_fields; cur_bytes = *matched_bytes; diff --git a/innobase/rem/rem0rec.c b/innobase/rem/rem0rec.c index 74876ad9402..90cbffe7a9e 100644 --- a/innobase/rem/rem0rec.c +++ b/innobase/rem/rem0rec.c @@ -333,14 +333,14 @@ rec_get_offsets_func( 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 (!*heap) { - *heap = mem_heap_create_func(size, + *heap = mem_heap_create_func(size * sizeof(ulint), 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); } |