1--source include/have_rocksdb.inc
2
3# Standard table locking:
4#   LOCK TABLE .. READ
5#   LOCK TABLE .. [LOW_PRIORITY] WRITE
6#   UNLOCK TABLES
7#
8# and global locking:
9# FLUSH TABLES [..] WITH READ LOCK
10#
11############################################
12# TODO:
13# A part of the test is currently disabled
14# because temporary tables are not supported
15############################################
16
17--enable_connect_log
18
19# Save the initial number of concurrent sessions.
20--source include/count_sessions.inc
21
22connect (con1,localhost,root,,);
23SET lock_wait_timeout=1;
24
25connection default;
26
27--disable_warnings
28DROP TABLE IF EXISTS t1, t2, t3;
29--enable_warnings
30
31CREATE TABLE t1 (id INT, id2 INT, pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=rocksdb;
32INSERT INTO t1 (id,id2) VALUES (1,1),(1,2),(1,3);
33
34# LOW_PRIORITY has no effect, but is still syntactically correct
35LOCK TABLE t1 LOW_PRIORITY WRITE;
36SELECT id2,COUNT(DISTINCT id) FROM t1 GROUP BY id2;
37
38UPDATE t1 SET id=-1 WHERE id=1;
39
40connection con1;
41# With WRITE lock held by connection 'default',
42# nobody else can access the table
43--error ER_LOCK_WAIT_TIMEOUT
44SELECT id,id2 FROM t1;
45--error ER_LOCK_WAIT_TIMEOUT
46LOCK TABLE t1 READ;
47
48connection default;
49LOCK TABLE t1 READ;
50--error ER_TABLE_NOT_LOCKED_FOR_WRITE
51UPDATE t1 SET id=1 WHERE id=1;
52
53connection con1;
54# With READ lock held by connection 'default',
55# it should be possible to read from the table
56# or acquire another READ lock,
57# but not update it or acquire WRITE lock
58SELECT COUNT(DISTINCT id) FROM t1;
59--error ER_LOCK_WAIT_TIMEOUT
60UPDATE t1 SET id=2 WHERE id=2;
61--error ER_LOCK_WAIT_TIMEOUT
62LOCK TABLE t1 WRITE;
63LOCK TABLE t1 READ;
64UNLOCK TABLES;
65
66
67--connection default
68
69--error ER_TABLE_NOT_LOCKED
70CREATE TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
71
72--disable_parsing
73
74CREATE TEMPORARY TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
75DROP TABLE IF EXISTS t2;
76
77--enable_parsing
78
79UNLOCK TABLES;
80
81CREATE TABLE t2 (id INT, id2 INT, pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=rocksdb;
82LOCK TABLE t1 WRITE, t2 WRITE;
83INSERT INTO t2 (id,id2) SELECT id,id2 FROM t1;
84UPDATE t1 SET id=1 WHERE id=-1;
85DROP TABLE t1,t2;
86
87#
88# INSERT ... SELECT with lock tables
89#
90
91CREATE TABLE t1 (i1 INT, nr INT, pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=rocksdb;
92CREATE TABLE t2 (nr INT, nm INT, pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=rocksdb;
93INSERT INTO t2 (nr,nm) VALUES (1,3);
94INSERT INTO t2 (nr,nm) VALUES (2,4);
95
96LOCK TABLES t1 WRITE, t2 READ;
97INSERT INTO t1 (i1,nr) SELECT 1, nr FROM t2 WHERE nm=3;
98INSERT INTO t1 (i1,nr) SELECT 2, nr FROM t2 WHERE nm=4;
99UNLOCK TABLES;
100
101LOCK TABLES t1 WRITE;
102--error ER_TABLE_NOT_LOCKED
103INSERT INTO t1 (i1,nr) SELECT i1, nr FROM t1;
104UNLOCK TABLES;
105LOCK TABLES t1 WRITE, t1 AS t1_alias READ;
106INSERT INTO t1 (i1,nr) SELECT i1, nr FROM t1 AS t1_alias;
107--error ER_TABLE_NOT_LOCKED
108DROP TABLE t1,t2;
109UNLOCK TABLES;
110DROP TABLE t1,t2;
111
112#
113# Check that a dropped table is removed from a lock
114
115CREATE TABLE t1 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
116CREATE TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(b)) ENGINE=rocksdb;
117CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb;
118LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE;
119# This removes one table after the other from the lock.
120DROP TABLE t2, t3, t1;
121#
122# Check that a lock merge works
123
124CREATE TABLE t1 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
125CREATE TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(b)) ENGINE=rocksdb;
126CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb;
127LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t1 AS t4 READ;
128
129ALTER TABLE t2 ADD COLUMN c2 INT;
130
131DROP TABLE t1, t2, t3;
132
133# FLUSH TABLES is not permitted when there is an active LOCK TABLES .. READ,
134# FLUSH TABLES .. WITH READ LOCK should be used instead
135# (and for other connections the table is locked)
136
137CREATE TABLE t1 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
138CREATE TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(b)) ENGINE=rocksdb;
139
140LOCK TABLE t1 READ, t2 READ;
141--error ER_TABLE_NOT_LOCKED_FOR_WRITE
142FLUSH TABLE t1;
143--error ER_TABLE_NOT_LOCKED_FOR_WRITE
144FLUSH TABLES;
145--error ER_LOCK_OR_ACTIVE_TRANSACTION
146FLUSH TABLES t1, t2 WITH READ LOCK;
147UNLOCK TABLES;
148
149FLUSH TABLES t1, t2 WITH READ LOCK;
150
151--connection con1
152--error ER_LOCK_WAIT_TIMEOUT
153INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
154
155--connection default
156UNLOCK TABLES;
157
158# Global lock
159
160FLUSH TABLES WITH READ LOCK;
161
162--connection con1
163--error ER_LOCK_WAIT_TIMEOUT
164INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
165
166--connection default
167UNLOCK TABLES;
168INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
169FLUSH TABLES WITH READ LOCK;
170--error ER_CANT_UPDATE_WITH_READLOCK
171DROP TABLE t1, t2;
172UNLOCK TABLES;
173DROP TABLE t1, t2;
174
175--disconnect con1
176
177#
178# Ensure that FLUSH TABLES doesn't substitute a base locked table
179# with a temporary one.
180#
181
182CREATE TABLE t1 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
183CREATE TABLE t2 (a INT, b CHAR(8), PRIMARY KEY(b)) ENGINE=rocksdb;
184
185LOCK TABLE t1 WRITE, t2 WRITE;
186
187--disable_parsing
188
189CREATE TEMPORARY TABLE t1 (a INT, b CHAR(8), PRIMARY KEY(a)) ENGINE=rocksdb;
190FLUSH TABLE t1;
191DROP TEMPORARY TABLE t1;
192
193--enable_parsing
194
195SELECT a,b FROM t1;
196UNLOCK TABLES;
197DROP TABLE t1, t2;
198
199CREATE TABLE t1 (i INT) ENGINE=MyISAM;
200HANDLER t1 OPEN h;
201CREATE TABLE t2 (i INT) ENGINE=RocksDB;
202LOCK TABLES t2 WRITE;
203
204--connect (con1,localhost,root,,test)
205--connection con1
206--send
207FLUSH TABLES WITH READ LOCK;
208
209--connection default
210INSERT INTO t2 VALUES (1);
211UNLOCK TABLES;
212HANDLER h CLOSE;
213
214--connection con1
215--reap
216--disconnect con1
217
218--connection default
219DROP TABLE t1, t2;
220
221# Check that all connections opened by test cases in this file are really
222# gone so execution of other tests won't be affected by their presence.
223--source include/wait_until_count_sessions.inc
224
225