mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
429 lines
13 KiB
Text
429 lines
13 KiB
Text
# WL#6745 InnoDB R-tree support
|
|
# This test case will test R-tree split.
|
|
|
|
--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,,);
|
|
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';
|
|
--send select count(*) from t1 where MBRWithin(t1.c2, @g1);
|
|
|
|
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;
|
|
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,,);
|
|
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;
|
|
disconnect a;
|
|
disconnect b;
|
|
|
|
# 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,,);
|
|
SET SESSION debug_dbug='+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,,);
|
|
|
|
# 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;
|
|
|
|
disconnect a;
|
|
disconnect b;
|
|
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|