Commit 218dbf68 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-14058 InnoDB Assertion failure !leaf on rem0rec.cc line 566 on test innodb_gis.rtree_recovery

The function rtr_update_mbr_field_in_place() is generating
MLOG_REC_UPDATE_IN_PLACE or MLOG_COMP_REC_UPDATE_IN_PLACE records
on non-leaf pages, even though MLOG_WRITE_STRING would perfectly
suffice for updating a fixed-length data field.

btr_cur_parse_update_in_place(): If flags==7, the record may be
from rtr_update_mbr_field_in_place(), and we must check if the
page is a leaf page. Otherwise, assume that it is.

btr_cur_update_in_place(): Assert that the page is a leaf page.
parent 0f253d3e
...@@ -14,7 +14,6 @@ gis_split_inf : MDEV-14057 InnoDB GIS tests fail ...@@ -14,7 +14,6 @@ gis_split_inf : MDEV-14057 InnoDB GIS tests fail
row_format : MDEV-14057 InnoDB GIS tests fail row_format : MDEV-14057 InnoDB GIS tests fail
rtree_estimate : MDEV-14057 InnoDB GIS tests fail rtree_estimate : MDEV-14057 InnoDB GIS tests fail
rtree_multi_pk : MDEV-14057 InnoDB GIS tests fail rtree_multi_pk : MDEV-14057 InnoDB GIS tests fail
rtree_recovery : MDEV-14058 InnoDB Assertion failure !leaf on rem0rec.cc line 566 on test innodb_gis.rtree_recovery
tree_search : MDEV-14057 InnoDB GIS tests fail tree_search : MDEV-14057 InnoDB GIS tests fail
rtree_concurrent_srch: MDEV-14059 InnoDB assertion failure offset >= ((38U + 36 + 2 * 10) + 5) at page0page.h line 318 rtree_concurrent_srch: MDEV-14059 InnoDB assertion failure offset >= ((38U + 36 + 2 * 10) + 5) at page0page.h line 318
point_big : MDEV-14057 InnoDB GIS tests fail point_big : MDEV-14057 InnoDB GIS tests fail
......
# restart
create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb; create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
create procedure insert_t1(IN total int) create procedure insert_t1(IN total int)
begin begin
...@@ -33,10 +32,9 @@ Table Op Msg_type Msg_text ...@@ -33,10 +32,9 @@ Table Op Msg_type Msg_text
test.t1 check status OK test.t1 check status OK
select count(*) from t1; select count(*) from t1;
count(*) count(*)
18 17
select c1, ST_astext(c2) from t1; select c1, ST_astext(c2) from t1;
c1 ST_astext(c2) c1 ST_astext(c2)
350 POINT(10350 10350)
351 POINT(10351 10351) 351 POINT(10351 10351)
352 POINT(10352 10352) 352 POINT(10352 10352)
353 POINT(10353 10353) 353 POINT(10353 10353)
......
...@@ -3485,7 +3485,15 @@ btr_cur_parse_update_in_place( ...@@ -3485,7 +3485,15 @@ btr_cur_parse_update_in_place(
/* We do not need to reserve search latch, as the page is only /* We do not need to reserve search latch, as the page is only
being recovered, and there cannot be a hash index to it. */ being recovered, and there cannot be a hash index to it. */
offsets = rec_get_offsets(rec, index, NULL, true, /* The function rtr_update_mbr_field_in_place() is generating
these records on node pointer pages; therefore we have to
check if this is a leaf page. */
offsets = rec_get_offsets(rec, index, NULL,
flags != (BTR_NO_UNDO_LOG_FLAG
| BTR_NO_LOCKING_FLAG
| BTR_KEEP_SYS_FLAG)
|| page_is_leaf(page),
ULINT_UNDEFINED, &heap); ULINT_UNDEFINED, &heap);
if (!(flags & BTR_KEEP_SYS_FLAG)) { if (!(flags & BTR_KEEP_SYS_FLAG)) {
...@@ -3620,6 +3628,7 @@ btr_cur_update_in_place( ...@@ -3620,6 +3628,7 @@ btr_cur_update_in_place(
roll_ptr_t roll_ptr = 0; roll_ptr_t roll_ptr = 0;
ulint was_delete_marked; ulint was_delete_marked;
ut_ad(page_is_leaf(cursor->page_cur.block->frame));
rec = btr_cur_get_rec(cursor); rec = btr_cur_get_rec(cursor);
index = cursor->index; index = cursor->index;
ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(rec_offs_validate(rec, index, offsets));
......
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