1--source include/have_rocksdb.inc
2--source include/have_debug_sync.inc
3
4--source include/count_sessions.inc
5
6connect (con, localhost, root,,);
7connection default;
8eval SET SESSION TRANSACTION ISOLATION LEVEL $isolation_level;
9
10SET debug_sync='RESET';
11
12eval CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, index a(a));
13INSERT INTO t1 VALUES(1,1), (2,2), (3,3), (4,4), (5,5);
14
15# This will cause the SELECT to block after finding the first row, but
16# before locking and reading it.
17--echo --SK first row delete
18connection con;
19eval SET SESSION TRANSACTION ISOLATION LEVEL $isolation_level;
20SET debug_sync='rocksdb_concurrent_delete_sk SIGNAL parked WAIT_FOR go';
21send_eval SELECT a FROM t1 FORCE INDEX(a) FOR UPDATE;
22
23# While that connection is waiting, delete the first row (the one con
24# is about to lock and read
25connection default;
26SET debug_sync='now WAIT_FOR parked';
27eval DELETE FROM t1 WHERE pk = 1;
28
29# Signal the waiting select to continue
30SET debug_sync='now SIGNAL go';
31
32connection con;
33reap;
34
35# Deleting a middle row
36--echo --SK middle row delete
37SET debug_sync='rocksdb_concurrent_delete_sk SIGNAL parked WAIT_FOR go';
38send_eval SELECT a FROM t1 FORCE INDEX(a) FOR UPDATE;
39
40connection default;
41SET debug_sync='now WAIT_FOR parked';
42eval DELETE FROM t1 WHERE pk = 3;
43SET debug_sync='now SIGNAL go';
44
45connection con;
46if ($isolation_level == "REPEATABLE READ")
47{
48  --error ER_LOCK_DEADLOCK
49  reap;
50}
51if ($isolation_level == "READ COMMITTED")
52{
53  reap;
54}
55
56# Deleting the end row
57--echo --SK end row delete
58SET debug_sync='rocksdb_concurrent_delete_sk SIGNAL parked WAIT_FOR go';
59send_eval SELECT a FROM t1 FORCE INDEX(a) FOR UPDATE;
60
61connection default;
62SET debug_sync='now WAIT_FOR parked';
63eval DELETE FROM t1 WHERE pk = 5;
64SET debug_sync='now SIGNAL go';
65
66connection con;
67if ($isolation_level == "REPEATABLE READ")
68{
69  --error ER_LOCK_DEADLOCK
70  reap;
71}
72if ($isolation_level == "READ COMMITTED")
73{
74  reap;
75}
76
77# Cleanup
78connection default;
79disconnect con;
80set debug_sync='RESET';
81drop table t1;
82--source include/wait_until_count_sessions.inc
83