summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <marko@hundin.mysql.fi>2004-12-28 01:34:52 +0200
committerunknown <marko@hundin.mysql.fi>2004-12-28 01:34:52 +0200
commit7ce58befd33d78e1c11872fcbc696a9cfad698c2 (patch)
tree6da5ac10b2bcc95fc1120e9a5d69928fdbe40917
parente3c7697431c144215af2f752d5c23b5b06e29982 (diff)
downloadmariadb-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.c5
-rw-r--r--innobase/btr/btr0cur.c2
-rw-r--r--innobase/btr/btr0pcur.c4
-rw-r--r--innobase/include/rem0cmp.h8
-rw-r--r--innobase/include/rem0cmp.ic3
-rw-r--r--innobase/include/rem0rec.ic3
-rw-r--r--innobase/page/page0page.c3
-rw-r--r--innobase/rem/rem0cmp.c14
-rw-r--r--innobase/rem/rem0rec.c6
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);
}