diff options
-rw-r--r-- | mysql-test/suite/innodb_gis/disabled.def | 1 | ||||
-rw-r--r-- | mysql-test/suite/innodb_gis/r/rtree_concurrent_srch.result | 58 | ||||
-rw-r--r-- | mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test | 26 | ||||
-rw-r--r-- | storage/innobase/row/row0sel.cc | 10 |
4 files changed, 63 insertions, 32 deletions
diff --git a/mysql-test/suite/innodb_gis/disabled.def b/mysql-test/suite/innodb_gis/disabled.def index e29e33496e9..e486a70a0c6 100644 --- a/mysql-test/suite/innodb_gis/disabled.def +++ b/mysql-test/suite/innodb_gis/disabled.def @@ -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 diff --git a/mysql-test/suite/innodb_gis/r/rtree_concurrent_srch.result b/mysql-test/suite/innodb_gis/r/rtree_concurrent_srch.result index 232d6fa296d..1b52059fff9 100644 --- a/mysql-test/suite/innodb_gis/r/rtree_concurrent_srch.result +++ b/mysql-test/suite/innodb_gis/r/rtree_concurrent_srch.result @@ -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'; diff --git a/mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test b/mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test index ec6f496b5cc..c10ce368b11 100644 --- a/mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test +++ b/mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test @@ -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'; diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 9cad3ab7de6..c0e9f103f45 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -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, |