Current Path : /home/usr.opt/mysql57/mysql-test/suite/innodb_gis/t/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : /home/usr.opt/mysql57/mysql-test/suite/innodb_gis/t/rtree_concurrent_srch.test |
# 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 --source include/big_test.inc # Create table with R-tree index. create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb; # Insert enough values to let R-tree split. insert into t1 values(1, Point(1,1)); insert into t1 values(2, Point(2,2)); insert into t1 values(3, Point(3,3)); insert into t1 values(4, Point(4,4)); insert into t1 values(5, Point(5,5)); insert into t1 values(6, Point(6,6)); insert into t1 values(7, Point(7,7)); insert into t1 values(8, Point(8,8)); insert into t1 values(9, Point(9,9)); insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; 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 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'; --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'; insert into t1 select * from t1; SET DEBUG_SYNC = 'now SIGNAL go_ahead'; connection a; reap; select count(*) from t1 where MBRWithin(t1.c2, @g1); 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))'); select count(*) from t1 where MBRWithin(t1.c2, @g1); set @g1 = ST_GeomFromText('Polygon((10 10,10 800,800 800,800 10,10 10))'); select count(*) from t1 where MBRWithin(t1.c2, @g1); set session transaction isolation level serializable; truncate t1; # Test on predicate locking INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(4 4, 170 170)')); 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)')); 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' will place predicate lock on almost all pages connection a; set session transaction isolation level serializable; select @@tx_isolation; 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); # 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; select @@tx_isolation; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; # FIXME: Put this back once we sort out the shrink business #insert into t1 select * from t1; connection a; commit; connection default; select count(*) from t1; # Insert a record that would be in the search range insert into t1 values (105, Point(105, 105)); # Connection 'a' will place predicate lock on almost all pages 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); connection b; select @@innodb_lock_wait_timeout; select @@tx_isolation; --error ER_LOCK_WAIT_TIMEOUT insert into t1 select * from t1; select count(*) from t1; connection a; select sleep(2); commit; #==================Test predicates on "MBRIntersects"========================== connection default; truncate t1; # Test on predicate locking INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(4 4, 170 170)')); 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)')); 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' will place predicate lock on almost all pages connection a; set session transaction isolation level serializable; select @@tx_isolation; 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); # The split will replicate locks across pages connection b; set session transaction isolation level serializable; set session innodb_lock_wait_timeout = 1; select @@tx_isolation; 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; # Insert a record that would be in the search range insert into t1 values (105, Point(105, 105)); # Connection 'a' will place predicate lock on almost all pages 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); select count(*) from t1 where MBRIntersects(t1.c2, @g1); connection b; select @@innodb_lock_wait_timeout; select @@tx_isolation; # this should conflict with the "MBRIntersects" predicate lock in session "a" --error ER_LOCK_WAIT_TIMEOUT INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(8 105, 200 105)')); select count(*) from t1; connection a; select sleep(2); commit; #==================Test predicate lock on "delete"========================== connection default; truncate t1; # Test on predicate locking INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)')); 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)')); # Connection default will place predicate lock on follow range 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; --error ER_LOCK_WAIT_TIMEOUT insert into t1 values(4, Point(4,4)); connection default; rollback; #==================Test predicate lock on "select for update"================== connection default; truncate t1; # Test on predicate locking INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)')); INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(3 3, 160 160)')); 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)')); # Connection default will place predicate lock on follow range set @g1 = ST_GeomFromText('Polygon((3 3, 3 5, 5 5, 5 3, 3 3))'); start transaction; select count(*) from t1 where MBRWithin(t1.c2, @g1) for update; connection a; set session innodb_lock_wait_timeout = 1; select @@innodb_lock_wait_timeout; --error ER_LOCK_WAIT_TIMEOUT insert into t1 values(4, Point(4,4)); connection default; rollback; #==================Test predicates replicate through split ================= connection default; truncate t1; delimiter |; create procedure insert_t1(IN start int, IN total int) begin declare i int default 1; set i = start; while (i <= total) DO insert into t1 values (i, Point(i, i)); set i = i + 1; end while; end| delimiter ;| CALL insert_t1(0, 1000); # Connection 'a' will place predicate lock on root and last leaf page connection a; set session transaction isolation level serializable; select @@tx_isolation; 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); # Connection 'b' will split the last leaf page, so the predicate # lock should replicate connection b; CALL insert_t1(1001, 2000); # This insert goes to the new page after split, it should be blocked set session transaction isolation level serializable; set session innodb_lock_wait_timeout = 1; # Insert a record that would be in the search range --error ER_LOCK_WAIT_TIMEOUT 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; drop table t1; drop procedure insert_t1; #============ Test row locks ======================= create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb; INSERT INTO t1 VALUES (1, ST_GeomFromText('LineString(2 2, 150 150)')); INSERT INTO t1 VALUES (2, ST_GeomFromText('LineString(3 3, 160 160)')); INSERT INTO t1 VALUES (2, ST_GeomFromText('LineString(4 4, 170 170)')); 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,,); connection a; SET SESSION debug="+d,rtr_pcur_move_to_next_return"; 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); connect (b,localhost,root,,); connection b; # This should be successful delete from t1 where c1 = 1; connection a; commit; set transaction isolation level serializable; start transaction; set @g1 = ST_GeomFromText('Polygon((0 0, 0 300, 300 300, 300 0, 0 0))'); select count(*) from t1 where MBRwithin(t1.c2, @g1); connection b; set session innodb_lock_wait_timeout = 1; --error ER_LOCK_WAIT_TIMEOUT delete from t1 where c1 = 2; # Clean up. connection a; commit; connection default; drop table t1; SET DEBUG_SYNC= 'RESET'; # Test btr_discard_page adjust concurrent search path create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb; start transaction; insert into t1 values(1, Point(1,1)); insert into t1 values(2, Point(2,2)); insert into t1 values(3, Point(3,3)); insert into t1 values(4, Point(4,4)); insert into t1 values(5, Point(5,5)); insert into t1 values(6, Point(6,6)); insert into t1 values(7, Point(7,7)); insert into t1 values(8, Point(8,8)); insert into t1 values(9, Point(9,9)); insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; select count(*) from t1; 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'; send 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; --reap select count(*) from t1 where MBRWithin(t1.c2, @g1); connection default; DROP TABLE t1; SET DEBUG_SYNC = 'RESET'; create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb; delimiter |; create procedure insert_t1(IN total int) begin declare i int default 1; while (i <= total) DO insert into t1 values (i, Point(i, i)); set i = i + 1; end while; end| delimiter ;| 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'; --send 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; --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';