MDEV-14059 Work around a problem exposed by InnoDB GIS debug check
row_sel_get_clust_rec_for_mysql(): Look up the page from the buffer pool, similar to how MySQL 5.7 does it.
This commit is contained in:
parent
c8e6364407
commit
9c9db1cbe2
@ -12,7 +12,6 @@
|
||||
|
||||
gis_split_inf : MDEV-14057 InnoDB GIS tests fail
|
||||
rtree_multi_pk : 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
|
||||
point_big : MDEV-14057 InnoDB GIS tests fail
|
||||
geometry : MDEV-14057 InnoDB GIS tests fail
|
||||
bug16236208 : MDEV-14057 InnoDB GIS tests fail
|
||||
|
@ -14,22 +14,25 @@ insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
SET SESSION debug="+d,rtr_pcur_move_to_next_return";
|
||||
connect a,localhost,root,,;
|
||||
SET debug_dbug='+d,rtr_pcur_move_to_next_return';
|
||||
set session transaction isolation level serializable;
|
||||
set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
SET DEBUG_SYNC = 'row_search_for_mysql_before_return SIGNAL started WAIT_FOR go_ahead';
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1);;
|
||||
# Establish session con1 (user=root)
|
||||
connect con1,localhost,root,,;
|
||||
set session transaction isolation level serializable;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR started';
|
||||
insert into t1 select * from t1;
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
connection a;
|
||||
count(*)
|
||||
576
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1);
|
||||
count(*)
|
||||
1152
|
||||
connection default;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
|
||||
@ -53,6 +56,7 @@ insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
connection a;
|
||||
set session transaction isolation level serializable;
|
||||
select @@tx_isolation;
|
||||
@@tx_isolation
|
||||
@ -62,6 +66,7 @@ set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100)
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
0
|
||||
connect b,localhost,root,,;
|
||||
set session transaction isolation level serializable;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
select @@tx_isolation;
|
||||
@ -70,16 +75,20 @@ SERIALIZABLE
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
connection a;
|
||||
commit;
|
||||
connection default;
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
896
|
||||
insert into t1 values (105, Point(105, 105));
|
||||
connection a;
|
||||
start transaction;
|
||||
set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100))');
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
1
|
||||
connection b;
|
||||
select @@innodb_lock_wait_timeout;
|
||||
@@innodb_lock_wait_timeout
|
||||
1
|
||||
@ -91,10 +100,12 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
897
|
||||
connection a;
|
||||
select sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
commit;
|
||||
connection default;
|
||||
truncate t1;
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)'));
|
||||
@ -107,6 +118,7 @@ insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
connection a;
|
||||
set session transaction isolation level serializable;
|
||||
select @@tx_isolation;
|
||||
@@tx_isolation
|
||||
@ -116,6 +128,7 @@ set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100)
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
0
|
||||
connection b;
|
||||
set session transaction isolation level serializable;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
select @@tx_isolation;
|
||||
@ -125,11 +138,14 @@ insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
connection a;
|
||||
commit;
|
||||
connection default;
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
1792
|
||||
insert into t1 values (105, Point(105, 105));
|
||||
connection a;
|
||||
start transaction;
|
||||
set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100))');
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
@ -138,6 +154,7 @@ count(*)
|
||||
select count(*) from t1 where MBRIntersects(t1.c2, @g1);
|
||||
count(*)
|
||||
1793
|
||||
connection b;
|
||||
select @@innodb_lock_wait_timeout;
|
||||
@@innodb_lock_wait_timeout
|
||||
1
|
||||
@ -149,10 +166,12 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
1793
|
||||
connection a;
|
||||
select sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
commit;
|
||||
connection default;
|
||||
truncate t1;
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)'));
|
||||
@ -163,13 +182,16 @@ INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(8 8, 210 210)'));
|
||||
set @g1 = ST_GeomFromText('Polygon((3 3, 3 5, 5 5, 5 3, 3 3))');
|
||||
start transaction;
|
||||
delete from t1 where MBRWithin(t1.c2, @g1);
|
||||
connection a;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
select @@innodb_lock_wait_timeout;
|
||||
@@innodb_lock_wait_timeout
|
||||
1
|
||||
insert into t1 values(4, Point(4,4));
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
connection default;
|
||||
rollback;
|
||||
connection default;
|
||||
truncate t1;
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)'));
|
||||
@ -182,13 +204,16 @@ start transaction;
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1) for update;
|
||||
count(*)
|
||||
0
|
||||
connection a;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
select @@innodb_lock_wait_timeout;
|
||||
@@innodb_lock_wait_timeout
|
||||
1
|
||||
insert into t1 values(4, Point(4,4));
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
connection default;
|
||||
rollback;
|
||||
connection default;
|
||||
truncate t1;
|
||||
create procedure insert_t1(IN start int, IN total int)
|
||||
begin
|
||||
@ -200,6 +225,7 @@ set i = i + 1;
|
||||
end while;
|
||||
end|
|
||||
CALL insert_t1(0, 1000);
|
||||
connection a;
|
||||
set session transaction isolation level serializable;
|
||||
select @@tx_isolation;
|
||||
@@tx_isolation
|
||||
@ -208,17 +234,21 @@ start transaction;
|
||||
set @g1 = ST_GeomFromText('Polygon((800 800, 800 1000, 1000 1000, 1000 800, 800 800))');
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
199
|
||||
201
|
||||
connection b;
|
||||
CALL insert_t1(1001, 2000);
|
||||
set session transaction isolation level serializable;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
insert into t1 values (1200, Point(950, 950));
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
connection a;
|
||||
select sleep(2);
|
||||
sleep(2)
|
||||
0
|
||||
commit;
|
||||
SET SESSION debug="-d,rtr_pcur_move_to_next_return";
|
||||
disconnect a;
|
||||
disconnect b;
|
||||
connection default;
|
||||
drop table t1;
|
||||
drop procedure insert_t1;
|
||||
create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
|
||||
@ -229,14 +259,19 @@ INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(5 5, 180 180)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(6 6, 190 190)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(7 7, 200 200)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(8 8, 210 210)'));
|
||||
connect a,localhost,root,,;
|
||||
SET SESSION debug="+d,rtr_pcur_move_to_next_return";
|
||||
Warnings:
|
||||
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
|
||||
set transaction isolation level serializable;
|
||||
start transaction;
|
||||
set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100))');
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
0
|
||||
connect b,localhost,root,,;
|
||||
delete from t1 where c1 = 1;
|
||||
connection a;
|
||||
commit;
|
||||
set transaction isolation level serializable;
|
||||
start transaction;
|
||||
@ -244,10 +279,13 @@ set @g1 = ST_GeomFromText('Polygon((0 0, 0 300, 300 300, 300 0, 0 0))');
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
count(*)
|
||||
2
|
||||
connection b;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
delete from t1 where c1 = 2;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
connection a;
|
||||
commit;
|
||||
connection default;
|
||||
drop table t1;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
|
||||
@ -273,18 +311,22 @@ insert into t1 select * from t1;
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
4608
|
||||
connection b;
|
||||
set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
|
||||
set transaction isolation level read uncommitted;
|
||||
SET DEBUG_SYNC= 'row_search_for_mysql_before_return SIGNAL siga WAIT_FOR sigb';
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1);
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR siga';
|
||||
rollback;
|
||||
SET DEBUG_SYNC= 'now SIGNAL sigb';
|
||||
connection b;
|
||||
count(*)
|
||||
1
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1);
|
||||
count(*)
|
||||
0
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb;
|
||||
@ -298,15 +340,21 @@ end while;
|
||||
end|
|
||||
start transaction;
|
||||
CALL insert_t1(100);
|
||||
connection a;
|
||||
set @g1 = ST_GeomFromText('Polygon((0 0,0 1000,1000 1000,1000 0,0 0))');
|
||||
SET DEBUG_SYNC= 'rtr_pcur_move_to_next_return SIGNAL siga WAIT_FOR sigb';
|
||||
select count(*) from t1 where MBRWithin(t1.c2, @g1);;
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR siga';
|
||||
rollback;
|
||||
SET DEBUG_SYNC= 'now SIGNAL sigb';
|
||||
connection a;
|
||||
count(*)
|
||||
0
|
||||
connection default;
|
||||
drop procedure insert_t1;
|
||||
DROP TABLE t1;
|
||||
SET SESSION debug="-d,rtr_pcur_move_to_next_return";
|
||||
disconnect a;
|
||||
disconnect b;
|
||||
connection default;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
|
@ -1,9 +1,6 @@
|
||||
# WL#6745 InnoDB R-tree support
|
||||
# This test case will test R-tree split.
|
||||
|
||||
# Not supported in embedded
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
@ -32,8 +29,7 @@ insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
|
||||
connect (a,localhost,root,,);
|
||||
connection a;
|
||||
SET SESSION debug="+d,rtr_pcur_move_to_next_return";
|
||||
SET debug_dbug='+d,rtr_pcur_move_to_next_return';
|
||||
|
||||
set session transaction isolation level serializable;
|
||||
set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))');
|
||||
@ -41,9 +37,7 @@ SET DEBUG_SYNC = 'RESET';
|
||||
SET DEBUG_SYNC = 'row_search_for_mysql_before_return SIGNAL started WAIT_FOR go_ahead';
|
||||
--send select count(*) from t1 where MBRWithin(t1.c2, @g1);
|
||||
|
||||
--echo # Establish session con1 (user=root)
|
||||
connect (con1,localhost,root,,);
|
||||
connection con1;
|
||||
set session transaction isolation level serializable;
|
||||
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR started';
|
||||
@ -92,7 +86,6 @@ select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
|
||||
# The split will replicate locks across pages
|
||||
connect (b,localhost,root,,);
|
||||
connection b;
|
||||
set session transaction isolation level serializable;
|
||||
set session innodb_lock_wait_timeout = 1;
|
||||
|
||||
@ -292,15 +285,8 @@ insert into t1 values (1200, Point(950, 950));
|
||||
connection a;
|
||||
select sleep(2);
|
||||
commit;
|
||||
|
||||
connection a;
|
||||
SET SESSION debug="-d,rtr_pcur_move_to_next_return";
|
||||
disconnect a;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection b;
|
||||
disconnect b;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
# Clean up.
|
||||
connection default;
|
||||
@ -321,7 +307,6 @@ INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(7 7, 200 200)'));
|
||||
INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(8 8, 210 210)'));
|
||||
|
||||
connect (a,localhost,root,,);
|
||||
connection a;
|
||||
SET SESSION debug="+d,rtr_pcur_move_to_next_return";
|
||||
|
||||
set transaction isolation level serializable;
|
||||
@ -330,7 +315,6 @@ set @g1 = ST_GeomFromText('Polygon((100 100, 100 110, 110 110, 110 100, 100 100)
|
||||
select count(*) from t1 where MBRwithin(t1.c2, @g1);
|
||||
|
||||
connect (b,localhost,root,,);
|
||||
connection b;
|
||||
|
||||
# This should be successful
|
||||
delete from t1 where c1 = 1;
|
||||
@ -432,20 +416,14 @@ rollback;
|
||||
SET DEBUG_SYNC= 'now SIGNAL sigb';
|
||||
|
||||
connection a;
|
||||
--reap;
|
||||
reap;
|
||||
|
||||
connection default;
|
||||
drop procedure insert_t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
connection a;
|
||||
SET SESSION debug="-d,rtr_pcur_move_to_next_return";
|
||||
disconnect a;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection b;
|
||||
disconnect b;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection default;
|
||||
SET DEBUG_SYNC = 'RESET';
|
||||
|
@ -3392,8 +3392,14 @@ row_sel_get_clust_rec_for_mysql(
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
buf_block_t* block = btr_pcur_get_block(
|
||||
prebuilt->pcur);
|
||||
/* FIXME: Why is this block not the
|
||||
same as btr_pcur_get_block(prebuilt->pcur),
|
||||
and is it not unsafe to use RW_NO_LATCH here? */
|
||||
buf_block_t* block = buf_page_get_gen(
|
||||
btr_pcur_get_block(prebuilt->pcur)->page.id,
|
||||
dict_table_page_size(sec_index->table),
|
||||
RW_NO_LATCH, NULL, BUF_GET,
|
||||
__FILE__, __LINE__, mtr, &err);
|
||||
mem_heap_t* heap = mem_heap_create(256);
|
||||
dtuple_t* tuple = dict_index_build_data_tuple(
|
||||
rec, sec_index, true,
|
||||
|
Loading…
x
Reference in New Issue
Block a user