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