drop table if exists t1,t2; drop DATABASE if exists mysqltest_1; connect locker,localhost,root,,; connect locker2,localhost,root,,; connect reader,localhost,root,,; connect writer,localhost,root,,; connection locker; create table t1(n int); insert into t1 values (1); connection locker2; select get_lock("mysqltest_lock", 100); get_lock("mysqltest_lock", 100) 1 connection locker; update t1 set n = 2 and get_lock('mysqltest_lock', 100); connection writer; update low_priority t1 set n = 4; connection reader; select n from t1; connection locker2; select release_lock("mysqltest_lock"); release_lock("mysqltest_lock") 1 connection locker; select release_lock("mysqltest_lock"); release_lock("mysqltest_lock") 1 connection writer; connection reader; n 4 drop table t1; connection locker; create table t1(n int); insert into t1 values (1),(2); connection locker2; select get_lock("mysqltest_lock", 100); get_lock("mysqltest_lock", 100) 1 connection locker; select n from t1 where get_lock('mysqltest_lock', 100); connection writer; update low_priority t1 set n = 4; connection reader; select n from t1; n 1 2 connection locker2; select release_lock("mysqltest_lock"); release_lock("mysqltest_lock") 1 connection locker; n 1 2 select release_lock("mysqltest_lock"); release_lock("mysqltest_lock") 1 connection writer; drop table t1; connection locker; create table t1 (a int, b int); create table t2 (c int, d int); insert into t1 values(1,1); insert into t1 values(2,2); insert into t2 values(1,2); lock table t1 read; connection writer; update t1,t2 set c=a where b=d; connection reader; select c from t2; c 2 connection locker; unlock tables; drop table t1; drop table t2; connection locker; create table t1 (a int); create table t2 (a int); lock table t1 write, t2 write; connection reader; insert t1 select * from t2; connection locker; drop table t2; unlock tables; connection reader; ERROR 42S02: Table 'test.t2' doesn't exist connection locker; drop table t1; connection locker; create table t1 (a int); create table t2 (a int); lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write; connection reader; insert t1 select * from t2; connection locker; drop table t2; unlock tables; connection reader; ERROR 42S02: Table 'test.t2' doesn't exist connection locker; drop table t1; End of 4.1 tests create table t1(a int); lock tables t1 write; connection reader; show columns from t1; Field Type Null Key Default Extra a int(11) YES NULL connection locker; unlock tables; drop table t1; connection locker; USE mysql; LOCK TABLES columns_priv WRITE, db WRITE, user WRITE; FLUSH TABLES; connection reader; USE mysql; SELECT global_priv.host FROM global_priv, db WHERE global_priv.user = db.user LIMIT 1; connection locker; OPTIMIZE TABLES columns_priv, db, global_priv; Table Op Msg_type Msg_text mysql.columns_priv optimize status OK mysql.db optimize status OK mysql.global_priv optimize status OK UNLOCK TABLES; connection reader; host localhost USE test; connection locker; use test; connection default; connection writer; CREATE TABLE t1 (c1 int); LOCK TABLE t1 WRITE; connection locker; FLUSH TABLES WITH READ LOCK; connection writer; CREATE TABLE t2 (c1 int); ERROR HY000: Table 't2' was not locked with LOCK TABLES UNLOCK TABLES; connection locker; UNLOCK TABLES; connection default; DROP TABLE t1; connection writer; CREATE TABLE t1 (c1 int); LOCK TABLE t1 WRITE; connection locker; FLUSH TABLES WITH READ LOCK; connection writer; CREATE TABLE t2 AS SELECT * FROM t1; ERROR HY000: Table 't2' was not locked with LOCK TABLES UNLOCK TABLES; connection locker; UNLOCK TABLES; connection default; DROP TABLE t1; connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; CREATE DATABASE mysqltest_1; FLUSH TABLES WITH READ LOCK; connection con2; DROP DATABASE mysqltest_1; connection con1; DROP DATABASE mysqltest_1; ERROR HY000: Can't execute the query because you have a conflicting read lock UNLOCK TABLES; connection con2; connection default; disconnect con1; disconnect con2; DROP DATABASE mysqltest_1; ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist connection locker; set sql_mode=""; create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb; set sql_mode=default; lock tables t1 write; connection writer; alter table t1 auto_increment=0; connection reader; alter table t1 auto_increment=0; connection locker; unlock tables; connection writer; connection reader; connection locker; drop table t1; connect con1,localhost,root,,; connect con2,localhost,root,,; connect con3,localhost,root,,; connect con4,localhost,root,,; connect con5,localhost,root,,; create table t1 (a int); create table t2 like t1; connection con1; lock tables t1 write; connection con2; flush tables with read lock; connection con5; # global read lock is taken connection con3; select * from t2 for update; connection con5; # waiting for release of read lock connection con4; # would hang and later cause a deadlock flush tables t2; connection con1; # clean up unlock tables; connection con2; unlock tables; connection con3; a connection con4; connection default; disconnect con5; disconnect con4; disconnect con3; disconnect con2; disconnect con1; drop table t1,t2; # # Lightweight version: # Ensure that the wait for a GRL is done before opening tables. # connect con1,localhost,root,,; connect con2,localhost,root,,; create table t1 (a int); create table t2 like t1; # # UPDATE # connection default; flush tables with read lock; connection con1; update t2 set a = 1; connection default; # statement is waiting for release of read lock connection con2; flush table t2; connection default; unlock tables; connection con1; connection con2; # # LOCK TABLES .. WRITE # connection default; flush tables with read lock; connection con1; lock tables t2 write; connection default; # statement is waiting for release of read lock connection con2; flush table t2; connection default; unlock tables; connection con1; unlock tables; connection default; disconnect con2; disconnect con1; drop table t1,t2; End of 5.0 tests create table t1 (i int); connection locker; lock table t1 read; connection writer; update t1 set i= 10; connection reader; select * from t1; connection default; kill query ID; connection reader; i connection writer; ERROR 70100: Query execution was interrupted connection locker; unlock tables; connection default; drop table t1; disconnect locker; disconnect locker2; disconnect reader; disconnect writer; drop table if exists t1; create table t1 (i int); connect flush,localhost,root,,test,,; connection default; lock tables t1 write; connection flush; flush tables with read lock;; connection default; alter table t1 add column j int; connect insert,localhost,root,,test,,; connection insert; insert into t1 values (1,2); connection default; unlock tables; connection flush; select * from t1; i j unlock tables; connection insert; connection default; select * from t1; i j 1 2 drop table t1; disconnect flush; disconnect insert; drop table if exists t1; create table t1 (i int); connect flush,localhost,root,,test,,; connection default; lock tables t1 write; connection flush; flush tables with read lock;; connection default; flush tables; unlock tables; connection flush; connection default; disconnect flush; drop table t1; drop table if exists t1,t2; create table t1 (a int); flush status; lock tables t1 read; connect waiter,localhost,root,,; connection waiter; insert into t1 values(1); connection default; unlock tables; connection waiter; connection default; drop table t1; disconnect waiter; select @tlwa < @tlwb; @tlwa < @tlwb 1 End of 5.1 tests drop table if exists t1; create table t1 (i int); connect flush,localhost,root,,test,,; connection default; lock tables t1 write; connection flush; flush tables with read lock;; connection default; flush tables; drop table t1; connection flush; connection default; disconnect flush; # # Test for bug #46272 "MySQL 5.4.4, new MDL: unnecessary deadlock". # drop table if exists t1; create table t1 (c1 int primary key, c2 int, c3 int); insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0); begin; update t1 set c3=c3+1 where c2=3; connect con46272,localhost,root,,test,,; connection con46272; # The below ALTER TABLE statement should wait till transaction # in connection 'default' is complete and then succeed. # It should not deadlock or fail with ER_LOCK_DEADLOCK error. # Sending: alter table t1 add column c4 int;; connection default; # Wait until the above ALTER TABLE gets blocked because this # connection holds SW metadata lock on table to be altered. # The below statement should succeed. It should not # deadlock or end with ER_LOCK_DEADLOCK error. update t1 set c3=c3+1 where c2=4; # Unblock ALTER TABLE by committing transaction. commit; connection con46272; # Reaping ALTER TABLE. connection default; disconnect con46272; drop table t1; # # Bug#47249 assert in MDL_global_lock::is_lock_type_compatible # DROP TABLE IF EXISTS t1; DROP VIEW IF EXISTS v1; # # Test 1: LOCK TABLES v1 WRITE, t1 READ; # CREATE TABLE t1 ( f1 integer ); CREATE VIEW v1 AS SELECT f1 FROM t1 ; # Connection 2 connect con2,localhost,root; LOCK TABLES v1 WRITE, t1 READ; FLUSH TABLE t1; disconnect con2; # Connection 1 connection default; LOCK TABLES t1 WRITE; FLUSH TABLE t1; DROP TABLE t1; DROP VIEW v1; # # Test 2: LOCK TABLES t1 WRITE, v1 READ; # CREATE TABLE t1 ( f1 integer ); CREATE VIEW v1 AS SELECT f1 FROM t1 ; connect con2,localhost,root; LOCK TABLES t1 WRITE, v1 READ; FLUSH TABLE t1; disconnect con2; connection default; LOCK TABLES t1 WRITE; FLUSH TABLE t1; DROP TABLE t1; DROP VIEW v1; # # Test for bug #50913 "Deadlock between open_and_lock_tables_derived # and MDL". Also see additional coverage in mdl_sync.test. # drop table if exists t1; drop view if exists v1; connect con50913,localhost,root; connection default; create table t1 (i int); create view v1 as select i from t1; begin; select * from t1; i connection con50913; # Sending: alter table t1 add column j int; connection default; # Wait until ALTER TABLE gets blocked. # The below statement should try to acquire SW lock on 't1' # and therefore should get ER_LOCK_DEADLOCK error. Before # bug fix it acquired SR lock and hung on thr_lock.c lock. delete a from t1 as a where i = 1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction # Unblock ALTER TABLE. commit; connection con50913; # Reaping ALTER TABLE; connection default; begin; select * from v1; i connection con50913; # Sending: alter table t1 drop column j; connection default; # Wait until ALTER TABLE gets blocked. # The below statement should try to acquire SW lock on 't1' # and therefore should get ER_LOCK_DEADLOCK error. Before # bug fix it acquired SR lock and hung on thr_lock.c lock. insert into v1 values (1); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction # Unblock ALTER TABLE. commit; connection con50913; # Reaping ALTER TABLE; connection default; disconnect con50913; drop view v1; drop table t1; # # Bug#45225 Locking: hang if drop table with no timeout # # These tests also provide function coverage for the # lock_wait_timeout server variable. # DROP TABLE IF EXISTS t1; CREATE TABLE t1 (id int); connect con2, localhost, root,,; SET SESSION lock_wait_timeout= 1; # # Test 1: acquire exclusive lock # connection default; START TRANSACTION; INSERT INTO t1 VALUES (1); connection con2; DROP TABLE t1; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection default; COMMIT; # # Test 2: upgrade shared lock # connection default; START TRANSACTION; SELECT * FROM t1; id 1 connection con2; ALTER TABLE t1 RENAME TO t2; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection default; COMMIT; # # Test 3: acquire shared lock # connection default; LOCK TABLE t1 WRITE; connection con2; INSERT INTO t1(id) VALUES (2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection default; UNLOCK TABLES; # # Test 4: table level locks # connection default; LOCK TABLE t1 READ; connection con2; INSERT INTO t1(id) VALUES(4); ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection default; UNLOCK TABLES; # # Test 5: Waiting on Table Definition Cache (TDC) # connect con3, localhost, root; connection default; LOCK TABLE t1 READ; connection con3; FLUSH TABLES; # Sending: FLUSH TABLES t1; connection con2; SELECT * FROM t1; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection default; UNLOCK TABLES; connection con3; # Reaping: FLUSH TABLES # # Test 6: Timeouts in I_S queries # connection default; CREATE TABLE t2 (id INT); LOCK TABLE t2 WRITE; connection con3; # Sending: DROP TABLE t1, t2; connection con2; SELECT table_name, table_comment FROM information_schema.tables WHERE table_schema= 'test' AND table_name= 't1'; table_name table_comment t1 Lock wait timeout exceeded; try restarting transaction Warnings: Warning 1205 Lock wait timeout exceeded; try restarting transaction connection default; UNLOCK TABLES; connection con3; # Reaping: DROP TABLE t1, t2 connection default; # Cleanup disconnect con2; disconnect con3; # # Test for bug #51134 "Crash in MDL_lock::destroy on a concurrent # DDL workload". # drop tables if exists t1, t2, t3; connect con1, localhost, root, , ; connect con2, localhost, root, , ; connection default; create table t3 (i int); connection con1; # Lock 't3' so upcoming RENAME is blocked. lock table t3 read; connection con2; # Remember ID for this connection. # Start statement which will try to acquire two instances # of X metadata lock on the same object. # Sending: rename tables t1 to t2, t2 to t3;; connection default; # Wait until RENAME TABLE is blocked on table 't3'. # Kill RENAME TABLE. kill query ID; connection con2; # RENAME TABLE should be aborted but should not crash. ERROR 70100: Query execution was interrupted connection con1; unlock tables; connection default; disconnect con1; disconnect con2; drop table t3; # # Test for the bug where upgradable metadata locks was acquired # even if the table to altered was temporary. # Bug found while working on the related bug #51240. # DROP TABLE IF EXISTS t1; CREATE TABLE t1 (id INT); LOCK TABLE t1 WRITE; connect con1, localhost, root; CREATE TEMPORARY TABLE t1 (id INT); ALTER TABLE t1 ADD COLUMN j INT; connection default; disconnect con1; UNLOCK TABLES; DROP TABLE t1;