mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 9854fb6fa7
			
		
	
	
	9854fb6fa7
	
	
	
		
			
			This patch adds for "--ps-protocol" second execution of queries "SELECT". Also in this patch it is added ability to disable/enable (--disable_ps2_protocol/--enable_ps2_protocol) second execution for "--ps-prototocol" in testcases.
		
			
				
	
	
		
			1085 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1085 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Save the initial number of concurrent sessions
 | |
| --source include/count_sessions.inc
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1,t2;
 | |
| drop DATABASE if exists mysqltest_1;
 | |
| --enable_warnings
 | |
| 
 | |
| # Test to see if select will get the lock ahead of low priority update
 | |
| 
 | |
| --disable_ps2_protocol
 | |
| 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);
 | |
| connection locker;
 | |
| send
 | |
| update t1 set n = 2 and get_lock('mysqltest_lock', 100);
 | |
| connection writer;
 | |
| # Wait till above update gets blocked on a user lock.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "User lock" and info = "update t1 set n = 2 and get_lock('mysqltest_lock', 100)";
 | |
| --source include/wait_condition.inc
 | |
| send
 | |
| update low_priority t1 set n = 4;
 | |
| connection reader;
 | |
| # Sleep a bit till the update of connection writer is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "update low_priority t1 set n = 4";
 | |
| --source include/wait_condition.inc
 | |
| send
 | |
| select n from t1;
 | |
| connection locker2;
 | |
| # Sleep a bit till the select of connection reader is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "select n from t1";
 | |
| --source include/wait_condition.inc
 | |
| select release_lock("mysqltest_lock");
 | |
| connection locker;
 | |
| reap;
 | |
| select release_lock("mysqltest_lock");
 | |
| connection writer;
 | |
| reap;
 | |
| connection reader;
 | |
| reap;
 | |
| drop table t1;
 | |
| 
 | |
| connection locker;
 | |
| create table t1(n int);
 | |
| insert into t1 values (1),(2);
 | |
| connection locker2;
 | |
| select get_lock("mysqltest_lock", 100);
 | |
| connection locker;
 | |
| send
 | |
| select n from t1 where get_lock('mysqltest_lock', 100);
 | |
| connection writer;
 | |
| # Wait till above select gets blocked on a user lock.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "User lock" and info = "select n from t1 where get_lock('mysqltest_lock', 100)";
 | |
| --source include/wait_condition.inc
 | |
| send
 | |
| update low_priority t1 set n = 4;
 | |
| connection reader;
 | |
| # Sleep a bit till the update of connection writer is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "update low_priority t1 set n = 4";
 | |
| --source include/wait_condition.inc
 | |
| select n from t1;
 | |
| connection locker2;
 | |
| select release_lock("mysqltest_lock");
 | |
| connection locker;
 | |
| reap;
 | |
| select release_lock("mysqltest_lock");
 | |
| connection writer;
 | |
| reap;
 | |
| drop table t1;
 | |
| --enable_ps2_protocol
 | |
| 
 | |
| #
 | |
| # Test problem when using locks with multi-updates
 | |
| # It should not block when multi-update is reading on a read-locked table
 | |
| #
 | |
| 
 | |
| 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;
 | |
| connection locker;
 | |
| unlock tables;
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| 
 | |
| #
 | |
| # Test problem when using locks on many tables and dropping a table that
 | |
| # is to-be-locked by another thread
 | |
| #
 | |
| #
 | |
| connection locker;
 | |
| create table t1 (a int);
 | |
| create table t2 (a int);
 | |
| lock table t1 write, t2 write;
 | |
| connection reader;
 | |
| send
 | |
| insert t1 select * from t2;
 | |
| connection locker;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "insert t1 select * from t2";
 | |
| --source include/wait_condition.inc
 | |
| drop table t2;
 | |
| unlock tables;
 | |
| connection reader;
 | |
| --error ER_NO_SUCH_TABLE
 | |
| reap;
 | |
| connection locker;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Same test as above, but with the dropped table locked twice
 | |
| #
 | |
| 
 | |
| 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;
 | |
| send
 | |
| insert t1 select * from t2;
 | |
| connection locker;
 | |
| # Sleep a bit till the insert of connection reader is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "insert t1 select * from t2";
 | |
| --source include/wait_condition.inc
 | |
| drop table t2;
 | |
| unlock tables;
 | |
| connection reader;
 | |
| --error ER_NO_SUCH_TABLE
 | |
| reap;
 | |
| connection locker;
 | |
| drop table t1;
 | |
| 
 | |
| 
 | |
| --echo End of 4.1 tests
 | |
| 
 | |
| #
 | |
| # Bug#9998 MySQL client hangs on USE "database"
 | |
| #
 | |
| create table t1(a int);
 | |
| lock tables t1 write;
 | |
| connection reader;
 | |
| show columns from t1;
 | |
| connection locker;
 | |
| unlock tables;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Bug#16986 Deadlock condition with MyISAM tables
 | |
| #
 | |
| 
 | |
| # Need a matching user in mysql.user for multi-table select
 | |
| --source include/add_anonymous_users.inc
 | |
| 
 | |
| connection locker;
 | |
| USE mysql;
 | |
| LOCK TABLES columns_priv WRITE, db WRITE, user WRITE;
 | |
| FLUSH TABLES;
 | |
| #
 | |
| connection reader;
 | |
| USE mysql;
 | |
| # Note:  This must be a multi-table select, otherwise the deadlock will not occur
 | |
| send
 | |
| SELECT global_priv.host FROM global_priv, db WHERE global_priv.user = db.user LIMIT 1;
 | |
| #
 | |
| connection locker;
 | |
| # Sleep a bit till the select of connection reader is in work and hangs
 | |
| let $wait_condition=
 | |
|   SELECT COUNT(*) = 1 FROM information_schema.processlist
 | |
|   WHERE state = "Waiting for table metadata lock" AND info =
 | |
|   "SELECT global_priv.host FROM global_priv, db WHERE global_priv.user = db.user LIMIT 1";
 | |
| --source include/wait_condition.inc
 | |
| # Make test case independent from earlier grants.
 | |
| --replace_result "Table is already up to date" "OK"
 | |
| OPTIMIZE TABLES columns_priv, db, global_priv;
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| connection reader;
 | |
| reap;
 | |
| USE test;
 | |
| #
 | |
| connection locker;
 | |
| use test;
 | |
| #
 | |
| connection default;
 | |
| #
 | |
| # Test if CREATE TABLE with LOCK TABLE deadlocks.
 | |
| #
 | |
| connection writer;
 | |
| CREATE TABLE t1 (c1 int);
 | |
| LOCK TABLE t1 WRITE;
 | |
| #
 | |
| # This waits until t1 is unlocked.
 | |
| connection locker;
 | |
| send
 | |
| FLUSH TABLES WITH READ LOCK;
 | |
| #
 | |
| connection writer;
 | |
| # Sleep a bit till the flush of connection locker is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "FLUSH TABLES WITH READ LOCK";
 | |
| --source include/wait_condition.inc
 | |
| # This must not block.
 | |
| --error ER_TABLE_NOT_LOCKED
 | |
| CREATE TABLE t2 (c1 int);
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| # This awakes now.
 | |
| connection locker;
 | |
| reap;
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| connection default;
 | |
| DROP TABLE t1;
 | |
| #
 | |
| # Test if CREATE TABLE SELECT with LOCK TABLE deadlocks.
 | |
| #
 | |
| connection writer;
 | |
| CREATE TABLE t1 (c1 int);
 | |
| LOCK TABLE t1 WRITE;
 | |
| #
 | |
| # This waits until t1 is unlocked.
 | |
| connection locker;
 | |
| send
 | |
| FLUSH TABLES WITH READ LOCK;
 | |
| #
 | |
| # This must not block.
 | |
| connection writer;
 | |
| # Sleep a bit till the flush of connection locker is in work and hangs
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "FLUSH TABLES WITH READ LOCK";
 | |
| --source include/wait_condition.inc
 | |
| --error ER_TABLE_NOT_LOCKED
 | |
| CREATE TABLE t2 AS SELECT * FROM t1;
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| # This awakes now.
 | |
| connection locker;
 | |
| reap;
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| connection default;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| --source include/delete_anonymous_users.inc
 | |
| 
 | |
| #
 | |
| # Bug#19815 CREATE/RENAME/DROP DATABASE can deadlock on a global read lock
 | |
| #
 | |
| connect (con1,localhost,root,,);
 | |
| connect (con2,localhost,root,,);
 | |
| #
 | |
| connection con1;
 | |
| CREATE DATABASE mysqltest_1;
 | |
| FLUSH TABLES WITH READ LOCK;
 | |
| #
 | |
| # With bug in place: acquire LOCK_mysql_create_table and
 | |
| # wait in wait_if_global_read_lock().
 | |
| connection con2;
 | |
| send
 | |
| DROP DATABASE mysqltest_1;
 | |
| #
 | |
| # With bug in place: try to acquire LOCK_mysql_create_table...
 | |
| # When fixed: Reject dropping db because of the read lock.
 | |
| connection con1;
 | |
| # Wait a bit so that the session con2 is in state
 | |
| # "Waiting for backup lock"
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock"
 | |
|   and info = "DROP DATABASE mysqltest_1";
 | |
| --source include/wait_condition.inc
 | |
| --error ER_CANT_UPDATE_WITH_READLOCK
 | |
| DROP DATABASE mysqltest_1;
 | |
| UNLOCK TABLES;
 | |
| #
 | |
| connection con2;
 | |
| reap;
 | |
| #
 | |
| connection default;
 | |
| disconnect con1;
 | |
| disconnect con2;
 | |
| # This must have been dropped by connection 2 already,
 | |
| # which waited until the global read lock was released.
 | |
| --error ER_DB_DROP_EXISTS
 | |
| DROP DATABASE mysqltest_1;
 | |
| 
 | |
| #
 | |
| # Bug#17264 MySQL Server freeze
 | |
| #
 | |
| connection locker;
 | |
| # Disable warnings to allow test to run also without InnoDB
 | |
| set sql_mode="";
 | |
| --disable_warnings
 | |
| create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb;
 | |
| --enable_warnings
 | |
| set sql_mode=default;
 | |
| lock tables t1 write;
 | |
| connection writer;
 | |
| send
 | |
| alter table t1 auto_increment=0;
 | |
| connection reader;
 | |
| # Wait till connection writer is blocked
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 auto_increment=0";
 | |
| --source include/wait_condition.inc
 | |
| send
 | |
| alter table t1 auto_increment=0;
 | |
| connection locker;
 | |
| # Wait till connection reader is blocked
 | |
| let $wait_condition=
 | |
|   select count(*) = 2 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 auto_increment=0";
 | |
| --source include/wait_condition.inc
 | |
| unlock tables;
 | |
| connection writer;
 | |
| reap;
 | |
| connection reader;
 | |
| reap;
 | |
| connection locker;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Bug#43230: SELECT ... FOR UPDATE can hang with FLUSH TABLES WITH READ LOCK indefinitely
 | |
| #
 | |
| 
 | |
| 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;
 | |
| send flush tables with read lock;
 | |
| connection con5;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "flush tables with read lock";
 | |
| --source include/wait_condition.inc
 | |
| --echo # global read lock is taken
 | |
| connection con3;
 | |
| send select * from t2 for update;
 | |
| connection con5;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "select * from t2 for update";
 | |
| --source include/wait_condition.inc
 | |
| --echo # waiting for release of read lock
 | |
| connection con4;
 | |
| --echo # would hang and later cause a deadlock
 | |
| --send flush tables t2
 | |
| connection con1;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "flush tables t2";
 | |
| --source include/wait_condition.inc
 | |
| --echo # clean up
 | |
| unlock tables;
 | |
| connection con2;
 | |
| --reap
 | |
| unlock tables;
 | |
| connection con3;
 | |
| --reap
 | |
| connection con4;
 | |
| --reap
 | |
| connection default;
 | |
| disconnect con5;
 | |
| disconnect con4;
 | |
| disconnect con3;
 | |
| disconnect con2;
 | |
| disconnect con1;
 | |
| 
 | |
| drop table t1,t2;
 | |
| 
 | |
| --echo #
 | |
| --echo # Lightweight version:
 | |
| --echo # Ensure that the wait for a GRL is done before opening tables.
 | |
| --echo #
 | |
| 
 | |
| connect (con1,localhost,root,,);
 | |
| connect (con2,localhost,root,,);
 | |
| 
 | |
| create table t1 (a int);
 | |
| create table t2 like t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # UPDATE
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| flush tables with read lock;
 | |
| connection con1;
 | |
| send update t2 set a = 1;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "update t2 set a = 1";
 | |
| --source include/wait_condition.inc
 | |
| --echo # statement is waiting for release of read lock
 | |
| connection con2;
 | |
| --send flush table t2
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "flush table t2";
 | |
| --source include/wait_condition.inc
 | |
| unlock tables;
 | |
| connection con1;
 | |
| --reap
 | |
| connection con2;
 | |
| --reap
 | |
| 
 | |
| --echo #
 | |
| --echo # LOCK TABLES .. WRITE
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| flush tables with read lock;
 | |
| connection con1;
 | |
| send lock tables t2 write;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "lock tables t2 write";
 | |
| --source include/wait_condition.inc
 | |
| --echo # statement is waiting for release of read lock
 | |
| connection con2;
 | |
| flush table t2;
 | |
| connection default;
 | |
| unlock tables;
 | |
| connection con1;
 | |
| --reap
 | |
| unlock tables;
 | |
| 
 | |
| connection default;
 | |
| disconnect con2;
 | |
| disconnect con1;
 | |
| 
 | |
| drop table t1,t2;
 | |
| 
 | |
| 
 | |
| --echo End of 5.0 tests
 | |
| 
 | |
| 
 | |
| #
 | |
| # Bug#21281 Pending write lock is incorrectly removed when its
 | |
| #           statement being KILLed
 | |
| #
 | |
| create table t1 (i int);
 | |
| connection locker;
 | |
| lock table t1 read;
 | |
| connection writer;
 | |
| send
 | |
| update t1 set i= 10;
 | |
| connection reader;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "update t1 set i= 10";
 | |
| --source include/wait_condition.inc
 | |
| send
 | |
| select * from t1;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "select * from t1";
 | |
| --source include/wait_condition.inc
 | |
| let $ID= `select id from information_schema.processlist
 | |
|           where state = "Waiting for table level lock" and
 | |
|                 info = "update t1 set i= 10"`;
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection reader;
 | |
| --reap
 | |
| connection writer;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| connection locker;
 | |
| unlock tables;
 | |
| connection default;
 | |
| drop table t1;
 | |
| 
 | |
| # Disconnect sessions used in many subtests above
 | |
| disconnect locker;
 | |
| disconnect locker2;
 | |
| disconnect reader;
 | |
| disconnect writer;
 | |
| 
 | |
| 
 | |
| #
 | |
| # Bug#32395 Alter table under a impending global read lock causes a server crash
 | |
| #
 | |
| 
 | |
| #
 | |
| # Test ALTER TABLE under LOCK TABLES and FLUSH TABLES WITH READ LOCK
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| create table t1 (i int);
 | |
| connect (flush,localhost,root,,test,,);
 | |
| connection default;
 | |
| lock tables t1 write;
 | |
| connection flush;
 | |
| --send flush tables with read lock;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "flush tables with read lock";
 | |
| --source include/wait_condition.inc
 | |
| alter table t1 add column j int;
 | |
| connect (insert,localhost,root,,test,,);
 | |
| connection insert;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "flush tables with read lock";
 | |
| --source include/wait_condition.inc
 | |
| --send insert into t1 values (1,2)
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "insert into t1 values (1,2)";
 | |
| --source include/wait_condition.inc
 | |
| unlock tables;
 | |
| connection flush;
 | |
| --reap
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock" and
 | |
|         info = "insert into t1 values (1,2)";
 | |
| --source include/wait_condition.inc
 | |
| select * from t1;
 | |
| unlock tables;
 | |
| connection insert;
 | |
| --reap
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from t1;
 | |
| --source include/wait_condition.inc
 | |
| select * from t1;
 | |
| drop table t1;
 | |
| disconnect flush;
 | |
| disconnect insert;
 | |
| 
 | |
| #
 | |
| # Test that FLUSH TABLES under LOCK TABLES protects write locked tables
 | |
| # from a impending FLUSH TABLES WITH READ LOCK
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| create table t1 (i int);
 | |
| connect (flush,localhost,root,,test,,);
 | |
| connection default;
 | |
| lock tables t1 write;
 | |
| connection flush;
 | |
| --send flush tables with read lock;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock";
 | |
| --source include/wait_condition.inc
 | |
| flush tables;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock";
 | |
| --source include/wait_condition.inc
 | |
| unlock tables;
 | |
| connection flush;
 | |
| --reap
 | |
| connection default;
 | |
| disconnect flush;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Bug#30331 Table_locks_waited shows inaccurate values
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1,t2;
 | |
| --enable_warnings
 | |
| create table t1 (a int);
 | |
| flush status;
 | |
| lock tables t1 read;
 | |
| let $tlwa= `show status like 'Table_locks_waited'`;
 | |
| connect (waiter,localhost,root,,);
 | |
| connection waiter;
 | |
| send insert into t1 values(1);
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table level lock" and
 | |
|         info = "insert into t1 values(1)";
 | |
| --source include/wait_condition.inc
 | |
| let $tlwb= `show status like 'Table_locks_waited'`;
 | |
| unlock tables;
 | |
| connection waiter;
 | |
| --reap
 | |
| connection default;
 | |
| drop table t1;
 | |
| disconnect waiter;
 | |
| --disable_query_log
 | |
| eval SET @tlwa= SUBSTRING_INDEX('$tlwa', '	', -1);
 | |
| eval SET @tlwb= SUBSTRING_INDEX('$tlwb', '	', -1);
 | |
| --enable_query_log
 | |
| select @tlwa < @tlwb;
 | |
| 
 | |
| --echo End of 5.1 tests
 | |
| 
 | |
| #
 | |
| # Test that DROP TABLES does not wait for a impending FLUSH TABLES
 | |
| # WITH READ LOCK
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| create table t1 (i int);
 | |
| connect (flush,localhost,root,,test,,);
 | |
| connection default;
 | |
| lock tables t1 write;
 | |
| connection flush;
 | |
| --send flush tables with read lock;
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock";
 | |
| --source include/wait_condition.inc
 | |
| flush tables;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for backup lock";
 | |
| --source include/wait_condition.inc
 | |
| drop table t1;
 | |
| connection flush;
 | |
| --reap
 | |
| connection default;
 | |
| disconnect flush;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test for bug #46272 "MySQL 5.4.4, new MDL: unnecessary deadlock".
 | |
| --echo #
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| 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;
 | |
| --echo # The below ALTER TABLE statement should wait till transaction
 | |
| --echo # in connection 'default' is complete and then succeed.
 | |
| --echo # It should not deadlock or fail with ER_LOCK_DEADLOCK error.
 | |
| --echo # Sending:
 | |
| --send alter table t1 add column c4 int;
 | |
| 
 | |
| connection default;
 | |
| --echo # Wait until the above ALTER TABLE gets blocked because this
 | |
| --echo # connection holds SW metadata lock on table to be altered.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 add column c4 int";
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| --echo # The below statement should succeed. It should not
 | |
| --echo # deadlock or end with ER_LOCK_DEADLOCK error.
 | |
| update t1 set c3=c3+1 where c2=4;
 | |
| 
 | |
| --echo # Unblock ALTER TABLE by committing transaction.
 | |
| commit;
 | |
| 
 | |
| connection con46272;
 | |
| --echo # Reaping ALTER TABLE.
 | |
| --reap
 | |
| 
 | |
| connection default;
 | |
| disconnect con46272;
 | |
| drop table t1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#47249 assert in MDL_global_lock::is_lock_type_compatible
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1;
 | |
| DROP VIEW  IF EXISTS v1;
 | |
| --enable_warnings
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 1: LOCK TABLES v1 WRITE, t1 READ;
 | |
| --echo #
 | |
| 
 | |
| CREATE TABLE t1 ( f1 integer );
 | |
| CREATE VIEW v1 AS SELECT f1 FROM t1 ;
 | |
| 
 | |
| --echo # Connection 2
 | |
| connect (con2,localhost,root);
 | |
| LOCK TABLES v1 WRITE, t1 READ;
 | |
| FLUSH TABLE t1;
 | |
| disconnect con2;
 | |
| --source include/wait_until_disconnected.inc
 | |
| 
 | |
| --echo # Connection 1
 | |
| connection default;
 | |
| LOCK TABLES t1 WRITE;
 | |
| FLUSH TABLE t1;                                    # Assertion happened here
 | |
| 
 | |
| # Cleanup
 | |
| DROP TABLE t1;
 | |
| DROP VIEW v1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 2: LOCK TABLES t1 WRITE, v1 READ;
 | |
| --echo #
 | |
| 
 | |
| 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;
 | |
| --source include/wait_until_disconnected.inc
 | |
| 
 | |
| connection default;
 | |
| LOCK TABLES t1 WRITE;
 | |
| FLUSH TABLE t1;                                    # Assertion happened here
 | |
| 
 | |
| # Cleanup
 | |
| DROP TABLE t1;
 | |
| DROP VIEW v1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test for bug #50913 "Deadlock between open_and_lock_tables_derived
 | |
| --echo # and MDL". Also see additional coverage in mdl_sync.test.
 | |
| --echo # 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| drop view if exists v1;
 | |
| --enable_warnings
 | |
| connect (con50913,localhost,root);
 | |
| connection default;
 | |
| create table t1 (i int);
 | |
| create view v1 as select i from t1;
 | |
| begin;
 | |
| select * from t1;
 | |
| 
 | |
| connection con50913;
 | |
| --echo # Sending:
 | |
| --send alter table t1 add column j int
 | |
| 
 | |
| connection default;
 | |
| --echo # Wait until ALTER TABLE gets blocked.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 add column j int";
 | |
| --source include/wait_condition.inc
 | |
| --echo # The below statement should try to acquire SW lock on 't1'
 | |
| --echo # and therefore should get ER_LOCK_DEADLOCK error. Before
 | |
| --echo # bug fix it acquired SR lock and hung on thr_lock.c lock.
 | |
| --error ER_LOCK_DEADLOCK
 | |
| delete a from t1 as a where i = 1;
 | |
| --echo # Unblock ALTER TABLE.
 | |
| commit;
 | |
| 
 | |
| connection con50913;
 | |
| --echo # Reaping ALTER TABLE;
 | |
| --reap
 | |
| 
 | |
| connection default;
 | |
| begin;
 | |
| select * from v1;
 | |
| 
 | |
| connection con50913;
 | |
| --echo # Sending:
 | |
| --send alter table t1 drop column j
 | |
| 
 | |
| connection default;
 | |
| --echo # Wait until ALTER TABLE gets blocked.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 drop column j";
 | |
| --source include/wait_condition.inc
 | |
| --echo # The below statement should try to acquire SW lock on 't1'
 | |
| --echo # and therefore should get ER_LOCK_DEADLOCK error. Before
 | |
| --echo # bug fix it acquired SR lock and hung on thr_lock.c lock.
 | |
| --error ER_LOCK_DEADLOCK
 | |
| insert into v1 values (1);
 | |
| --echo # Unblock ALTER TABLE.
 | |
| commit;
 | |
| 
 | |
| connection con50913;
 | |
| --echo # Reaping ALTER TABLE;
 | |
| --reap
 | |
| 
 | |
| connection default;
 | |
| disconnect con50913;
 | |
| drop view v1;
 | |
| drop table t1;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#45225 Locking: hang if drop table with no timeout
 | |
| --echo #
 | |
| --echo # These tests also provide function coverage for the
 | |
| --echo # lock_wait_timeout server variable.
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t1 (id int);
 | |
| 
 | |
| connect(con2, localhost, root,,);
 | |
| SET SESSION lock_wait_timeout= 1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 1: acquire exclusive lock
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| START TRANSACTION;
 | |
| INSERT INTO t1 VALUES (1);
 | |
| 
 | |
| connection con2;
 | |
| --error ER_LOCK_WAIT_TIMEOUT
 | |
| DROP TABLE t1;
 | |
| 
 | |
| connection default;
 | |
| COMMIT;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 2: upgrade shared lock
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| START TRANSACTION;
 | |
| SELECT * FROM t1;
 | |
| 
 | |
| connection con2;
 | |
| --error ER_LOCK_WAIT_TIMEOUT
 | |
| ALTER TABLE t1 RENAME TO t2;
 | |
| 
 | |
| connection default;
 | |
| COMMIT;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 3: acquire shared lock
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| LOCK TABLE t1 WRITE;
 | |
| 
 | |
| connection con2;
 | |
| --error ER_LOCK_WAIT_TIMEOUT
 | |
| INSERT INTO t1(id) VALUES (2);
 | |
| 
 | |
| connection default;
 | |
| UNLOCK TABLES;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 4: table level locks
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| LOCK TABLE t1 READ;
 | |
| 
 | |
| connection con2;
 | |
| --error ER_LOCK_WAIT_TIMEOUT
 | |
| INSERT INTO t1(id) VALUES(4);
 | |
| 
 | |
| connection default;
 | |
| UNLOCK TABLES;
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 5: Waiting on Table Definition Cache (TDC)
 | |
| --echo #
 | |
| 
 | |
| connect(con3, localhost, root);
 | |
| 
 | |
| connection default;
 | |
| LOCK TABLE t1 READ;
 | |
| 
 | |
| connection con3;
 | |
| 
 | |
| # first test that flush tables doesn't block
 | |
| FLUSH TABLES;
 | |
| 
 | |
| # Check the FLUSH TABLES t1 waits until table lock is released
 | |
| 
 | |
| --echo # Sending:
 | |
| --send FLUSH TABLES t1
 | |
| 
 | |
| connection con2;
 | |
| let $wait_condition=
 | |
|   SELECT COUNT(*) = 1 FROM information_schema.processlist
 | |
|   WHERE state = "Waiting for table metadata lock" AND info = "FLUSH TABLES t1";
 | |
| --source include/wait_condition.inc
 | |
| --error ER_LOCK_WAIT_TIMEOUT
 | |
| SELECT * FROM t1;
 | |
| 
 | |
| connection default;
 | |
| UNLOCK TABLES;
 | |
| 
 | |
| connection con3;
 | |
| --echo # Reaping: FLUSH TABLES
 | |
| --reap
 | |
| 
 | |
| --echo #
 | |
| --echo # Test 6: Timeouts in I_S queries
 | |
| --echo #
 | |
| 
 | |
| connection default;
 | |
| CREATE TABLE t2 (id INT);
 | |
| LOCK TABLE t2 WRITE;
 | |
| 
 | |
| connection con3;
 | |
| --echo # Sending:
 | |
| --send DROP TABLE t1, t2
 | |
| 
 | |
| connection con2;
 | |
| let $wait_condition=
 | |
|   SELECT COUNT(*) = 1 FROM information_schema.processlist
 | |
|   WHERE state = "Waiting for table metadata lock" AND
 | |
|         info = "DROP TABLE t1, t2";
 | |
| --source include/wait_condition.inc
 | |
| # Note: This query causes two timeouts.
 | |
| # 1: try_acquire_high_prio_shared_mdl_lock on t1
 | |
| # 2: recover_from_failed_open on t1
 | |
| SELECT table_name, table_comment FROM information_schema.tables
 | |
|   WHERE table_schema= 'test' AND table_name= 't1';
 | |
| 
 | |
| connection default;
 | |
| UNLOCK TABLES;
 | |
| 
 | |
| connection con3;
 | |
| --echo # Reaping: DROP TABLE t1, t2
 | |
| --reap
 | |
| 
 | |
| connection default;
 | |
| --echo # Cleanup
 | |
| disconnect con2;
 | |
| disconnect con3;
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Test for bug #51134 "Crash in MDL_lock::destroy on a concurrent
 | |
| --echo #                      DDL workload".
 | |
| --echo #
 | |
| --disable_warnings
 | |
| drop tables if exists t1, t2, t3;
 | |
| --enable_warnings
 | |
| connect (con1, localhost, root, , );
 | |
| connect (con2, localhost, root, , );
 | |
| connection default;
 | |
| create table t3 (i int);
 | |
| 
 | |
| connection con1;
 | |
| --echo # Lock 't3' so upcoming RENAME is blocked.
 | |
| lock table t3 read;
 | |
| 
 | |
| connection con2;
 | |
| --echo # Remember ID for this connection.
 | |
| let $ID= `select connection_id()`;
 | |
| --echo # Start statement which will try to acquire two instances
 | |
| --echo # of X metadata lock on the same object.
 | |
| --echo # Sending:
 | |
| --send rename tables t1 to t2, t2 to t3;
 | |
| 
 | |
| connection default;
 | |
| --echo # Wait until RENAME TABLE is blocked on table 't3'.
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "rename tables t1 to t2, t2 to t3";
 | |
| --source include/wait_condition.inc
 | |
| --echo # Kill RENAME TABLE.
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| 
 | |
| connection con2;
 | |
| --echo # RENAME TABLE should be aborted but should not crash.
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| connection con1;
 | |
| unlock tables;
 | |
| 
 | |
| connection default;
 | |
| disconnect con1;
 | |
| disconnect con2;
 | |
| drop table t3;
 | |
| 
 | |
| 
 | |
| --echo # 
 | |
| --echo # Test for the bug where upgradable metadata locks was acquired
 | |
| --echo # even if the table to altered was temporary.
 | |
| --echo # Bug found while working on the related bug #51240.
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t1 (id INT);
 | |
| LOCK TABLE t1 WRITE;
 | |
| 
 | |
| connect (con1, localhost, root);
 | |
| CREATE TEMPORARY TABLE t1 (id INT);
 | |
| # This alter should not block and timeout.
 | |
| ALTER TABLE t1 ADD COLUMN j INT;
 | |
| 
 | |
| connection default;
 | |
| disconnect con1;
 | |
| UNLOCK TABLES;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| 
 | |
| # Wait till all disconnects are completed
 | |
| --source include/wait_until_count_sessions.inc
 |