Skip to content

Commit 97041ac

Browse files
committed
Fix tokudb.gap_lock_error test
TokuDB testsuite makes use of includes not found in our default 10.0. Cherry pick them from Percona Server's include directory.
1 parent 4c3b732 commit 97041ac

File tree

6 files changed

+238
-6
lines changed

6 files changed

+238
-6
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--source include/have_partition.inc
2+
--source include/gap_lock_error_init.inc
3+
4+
let $select_lock=for update;
5+
let $autocommit = 0;
6+
--source include/gap_lock_error_select.inc
7+
let $autocommit = 1;
8+
--source include/gap_lock_error_select.inc
9+
10+
let $select_lock=lock in share mode;
11+
let $autocommit = 0;
12+
--source include/gap_lock_error_select.inc
13+
let $autocommit = 1;
14+
--source include/gap_lock_error_select.inc
15+
16+
let $select_lock=;
17+
let $autocommit = 0;
18+
--source include/gap_lock_error_select.inc
19+
let $autocommit = 1;
20+
--source include/gap_lock_error_select.inc
21+
22+
let $autocommit = 0;
23+
--source include/gap_lock_error_update.inc
24+
let $autocommit = 1;
25+
--source include/gap_lock_error_update.inc
26+
27+
--source include/gap_lock_error_cleanup.inc
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
drop table gap1, gap2, gap3, gap4;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
eval CREATE TABLE gap1 (id1 INT, id2 INT, id3 INT, c1 INT, value INT,
2+
PRIMARY KEY (id1, id2, id3),
3+
INDEX i (c1)) ENGINE=$engine;
4+
CREATE TABLE gap2 like gap1;
5+
eval CREATE TABLE gap3 (id INT, value INT,
6+
PRIMARY KEY (id),
7+
UNIQUE KEY ui(value)) ENGINE=$engine;
8+
eval CREATE TABLE gap4 (id INT, value INT,
9+
PRIMARY KEY (id)) ENGINE=$engine
10+
PARTITION BY HASH(id) PARTITIONS 2;
11+
--disable_query_log
12+
let $max = 1000;
13+
let $i = 1;
14+
while ($i <= $max) {
15+
eval INSERT INTO gap1 (id1, id2, id3, c1, value)
16+
VALUES ($i div 2, $i div 10, $i, $i, $i);
17+
eval INSERT INTO gap2 (id1, id2, id3, c1, value)
18+
VALUES ($i div 2, $i div 10, $i, $i, $i);
19+
inc $i;
20+
}
21+
--enable_query_log
22+
23+
insert into gap3 values (1,1), (2,2),(3,3),(4,4),(5,5);
24+
insert into gap4 values (1,1), (2,2),(3,3),(4,4),(5,5);
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
eval set session autocommit=$autocommit;
2+
let $is_gaplock_target = `SELECT @@autocommit = 0 && '$select_lock' != '' && '$expect_gap_lock_errors' = 1`;
3+
4+
if ($is_gaplock_target)
5+
{
6+
# rnd_init
7+
--error ER_UNKNOWN_ERROR
8+
eval select * from gap1 limit 1 $select_lock;
9+
--error ER_UNKNOWN_ERROR
10+
eval select * from gap1 where value != 100 limit 1 $select_lock;
11+
# index_read_map
12+
--error ER_UNKNOWN_ERROR
13+
eval select * from gap1 where id1=1 $select_lock;
14+
--error ER_UNKNOWN_ERROR
15+
eval select * from gap1 where id1=1 and id2= 1 $select_lock;
16+
# read_range_first
17+
--error ER_UNKNOWN_ERROR
18+
eval select * from gap1 where id1=1 and id2= 1 and id3 != 1 $select_lock;
19+
--error ER_UNKNOWN_ERROR
20+
eval select * from gap1 where id1=1 and id2= 1 and id3
21+
between 1 and 3 $select_lock;
22+
--error ER_UNKNOWN_ERROR
23+
eval select * from gap1 where id1=1 and id2= 1 order by id3 asc
24+
limit 1 $select_lock;
25+
--error ER_UNKNOWN_ERROR
26+
eval select * from gap1 where id1=1 and id2= 1 order by id3 desc
27+
limit 1 $select_lock;
28+
# index_first
29+
--error ER_UNKNOWN_ERROR
30+
eval select * from gap1 order by id1 asc limit 1 $select_lock;
31+
--error ER_UNKNOWN_ERROR
32+
eval select * from gap1 order by id1 asc, id2 asc, id3 asc limit 1 $select_lock;
33+
# index_last
34+
--error ER_UNKNOWN_ERROR
35+
eval select * from gap1 order by id1 desc limit 1 $select_lock;
36+
--error ER_UNKNOWN_ERROR
37+
eval select * from gap1 order by id1 desc, id2 desc, id3 desc
38+
limit 1 $select_lock;
39+
# secondary index lookup
40+
--error ER_UNKNOWN_ERROR
41+
eval select * from gap1 force index(i) where c1=1 $select_lock;
42+
# unique index lookup, ensure no gap lock errors as this is effectively a
43+
# single point select that does not lock ranges or gaps of keys
44+
eval select * from gap3 force index(ui) where value=1 $select_lock;
45+
# primary key lookup, ensure no gap lock errors as these are effectively
46+
# single point selects that do not lock ranges or gaps of keys
47+
eval select * from gap1 where id1=1 and id2=1 and id3=1 $select_lock;
48+
eval select * from gap1 where id1=1 and id2=1 and id3 in (1, 2, 3) $select_lock;
49+
eval select * from gap1 where id1=1 and id2=1 and id3=1 and value=1
50+
order by c1 $select_lock;
51+
eval select * from gap3 where id=1 $select_lock;
52+
eval select * from gap4 where id=1 $select_lock;
53+
eval select * from gap4 where id in (1, 2, 3) $select_lock;
54+
--error ER_UNKNOWN_ERROR
55+
eval select * from gap4 $select_lock;
56+
--error ER_UNKNOWN_ERROR
57+
eval select * from gap4 where id between 3 and 7 $select_lock;
58+
}
59+
60+
if (!$is_gaplock_target)
61+
{
62+
eval select * from gap1 limit 1 $select_lock;
63+
eval select * from gap1 where value != 100 limit 1 $select_lock;
64+
eval select * from gap1 where id1=1 $select_lock;
65+
eval select * from gap1 where id1=1 and id2= 1 $select_lock;
66+
eval select * from gap1 where id1=1 and id2= 1 and id3 != 1 $select_lock;
67+
eval select * from gap1 where id1=1 and id2= 1 and id3
68+
between 1 and 3 $select_lock;
69+
eval select * from gap1 where id1=1 and id2= 1 order by id3 asc
70+
limit 1 $select_lock;
71+
eval select * from gap1 where id1=1 and id2= 1 order by id3 desc
72+
limit 1 $select_lock;
73+
eval select * from gap1 order by id1 asc limit 1 $select_lock;
74+
eval select * from gap1 order by id1 asc, id2 asc, id3 asc limit 1 $select_lock;
75+
eval select * from gap1 order by id1 desc limit 1 $select_lock;
76+
eval select * from gap1 order by id1 desc, id2 desc, id3 desc
77+
limit 1 $select_lock;
78+
eval select * from gap1 force index(i) where c1=1 $select_lock;
79+
eval select * from gap3 force index(ui) where value=1 $select_lock;
80+
eval select * from gap1 where id1=1 and id2=1 and id3=1 $select_lock;
81+
eval select * from gap1 where id1=1 and id2=1 and id3 in (1, 2, 3) $select_lock;
82+
eval select * from gap1 where id1=1 and id2=1 and id3=1 and value=1
83+
order by c1 $select_lock;
84+
eval select * from gap3 where id=1 $select_lock;
85+
eval select * from gap4 where id=1 $select_lock;
86+
eval select * from gap4 where id in (1, 2, 3) $select_lock;
87+
eval select * from gap4 $select_lock;
88+
eval select * from gap4 where id between 3 and 7 $select_lock;
89+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
eval set session autocommit=$autocommit;
2+
let $is_gaplock_target = `SELECT @@autocommit = 0 && '$expect_gap_lock_errors' = 1`;
3+
4+
if ($is_gaplock_target)
5+
{
6+
## single-table insert,update,delete
7+
insert into gap1 (id1, id2, id3) values (-1,-1,-1);
8+
insert into gap1 (id1, id2, id3) values (-1,-1,-1)
9+
on duplicate key update value=100;
10+
--error ER_UNKNOWN_ERROR
11+
update gap1 set value=100 where id1=1;
12+
update gap1 set value=100 where id1=1 and id2=1 and id3=1;
13+
--error ER_UNKNOWN_ERROR
14+
delete from gap1 where id1=2;
15+
delete from gap1 where id1=-1 and id2=-1 and id3=-1;
16+
commit;
17+
18+
## multi-table statements (preventing all gap locks with autocommit)
19+
# insert into select
20+
--error ER_UNKNOWN_ERROR
21+
insert into gap2 select * from gap1;
22+
--error ER_UNKNOWN_ERROR
23+
insert into gap2 select * from gap1 where id1=1;
24+
insert into gap2 select * from gap1 where id1=1 and id2=1 and id3=1;
25+
26+
# create table select
27+
create table t4 select * from gap1 where id1=1 and id2=1 and id3=1;
28+
drop table t4;
29+
--error ER_UNKNOWN_ERROR
30+
create table t4 select * from gap1;
31+
--error ER_UNKNOWN_ERROR
32+
create table t4 select * from gap1 where id1=1;
33+
34+
# update join
35+
update gap1 join gap2 on gap1.id1 and gap1.id2=gap2.id2 set gap1.value=100 where gap2.id1=3
36+
and gap2.id2=3 and gap2.id3=3;
37+
--error ER_UNKNOWN_ERROR
38+
update gap1 join gap2 on gap1.id1 and gap1.id2=gap2.id2 set gap1.value=100 where gap2.id1=3;
39+
--error ER_UNKNOWN_ERROR
40+
update gap1 join gap2 on gap1.id1 and gap1.id2=gap2.id2 join gap3 on gap1.id1=gap3.id
41+
set gap1.value=100 where gap2.id1=3;
42+
--error ER_UNKNOWN_ERROR
43+
update gap1 set gap1.value= (select count(*) from gap2);
44+
45+
# delete join
46+
delete gap1 from gap1 join gap2 on gap1.id1 and gap1.id2=gap2.id2 where gap2.id1=3
47+
and gap2.id2=3 and gap2.id3=3;
48+
--error ER_UNKNOWN_ERROR
49+
delete gap1 from gap1 join gap2 on gap1.id1 and gap1.id2=gap2.id2 where gap2.id1=3;
50+
51+
# select join / self join
52+
--error ER_UNKNOWN_ERROR
53+
select * from gap1, gap2 limit 1 for update;
54+
--error ER_UNKNOWN_ERROR
55+
select * from gap1 a, gap1 b limit 1 for update;
56+
57+
# unique secondary key
58+
create table u1(
59+
c1 int,
60+
c2 int,
61+
c3 int,
62+
c4 int,
63+
primary key (c1, c2, c3),
64+
unique key (c3, c1)
65+
);
66+
begin;
67+
insert into u1 values (1,1,1,1);
68+
commit;
69+
begin;
70+
insert into u1 values (1,2,1,1) on duplicate key update c4=10;
71+
commit;
72+
begin;
73+
select * from u1 where c3=1 and c1 = 1 for update;
74+
--error ER_UNKNOWN_ERROR
75+
select * from u1 where c3=1 for update;
76+
commit;
77+
drop table u1;
78+
}
79+
80+
if (!$is_gaplock_target)
81+
{
82+
# autocommit doesn't prevent single table operations
83+
insert into gap1 (id1, id2, id3) values (-1,-1,-1);
84+
insert into gap1 (id1, id2, id3) values (-1,-1,-1)
85+
on duplicate key update value=100;
86+
update gap1 set value=100 where id1=1;
87+
update gap1 set value=100 where id1=1 and id2=1 and id3=1;
88+
delete from gap1 where id1=2;
89+
delete from gap1 where id1=-1 and id2=-1 and id3=-1;
90+
commit;
91+
}

storage/tokudb/mysql-test/tokudb/r/gap_lock_error.result

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ id value
8080
5 5
8181
select * from gap4 where id between 3 and 7 for update;
8282
id value
83-
4 4
8483
3 3
84+
4 4
8585
5 5
8686
set session autocommit=1;
8787
select * from gap1 limit 1 for update;
@@ -153,8 +153,8 @@ id value
153153
5 5
154154
select * from gap4 where id between 3 and 7 for update;
155155
id value
156-
4 4
157156
3 3
157+
4 4
158158
5 5
159159
set session autocommit=0;
160160
select * from gap1 limit 1 lock in share mode;
@@ -226,8 +226,8 @@ id value
226226
5 5
227227
select * from gap4 where id between 3 and 7 lock in share mode;
228228
id value
229-
4 4
230229
3 3
230+
4 4
231231
5 5
232232
set session autocommit=1;
233233
select * from gap1 limit 1 lock in share mode;
@@ -299,8 +299,8 @@ id value
299299
5 5
300300
select * from gap4 where id between 3 and 7 lock in share mode;
301301
id value
302-
4 4
303302
3 3
303+
4 4
304304
5 5
305305
set session autocommit=0;
306306
select * from gap1 limit 1 ;
@@ -372,8 +372,8 @@ id value
372372
5 5
373373
select * from gap4 where id between 3 and 7 ;
374374
id value
375-
4 4
376375
3 3
376+
4 4
377377
5 5
378378
set session autocommit=1;
379379
select * from gap1 limit 1 ;
@@ -445,8 +445,8 @@ id value
445445
5 5
446446
select * from gap4 where id between 3 and 7 ;
447447
id value
448-
4 4
449448
3 3
449+
4 4
450450
5 5
451451
set session autocommit=0;
452452
insert into gap1 (id1, id2, id3) values (-1,-1,-1);

0 commit comments

Comments
 (0)