mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			322 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #
 | |
| # Test KILL and KILL QUERY statements.
 | |
| #
 | |
| # Killing a connection in an embedded server does not work like in a normal
 | |
| # server, if it is waiting for a new statement. In an embedded server, the
 | |
| # connection does not read() from a socket, but returns control to the
 | |
| # application. 'mysqltest' does not handle the kill request.
 | |
| #
 | |
| 
 | |
| -- source include/count_sessions.inc
 | |
| -- source include/not_embedded.inc
 | |
| 
 | |
| --disable_service_connection
 | |
| 
 | |
| set local sql_mode="";
 | |
| set global sql_mode="";
 | |
| 
 | |
| connect con1, localhost, root;
 | |
| connect con2, localhost, root;
 | |
| 
 | |
| --echo #
 | |
| --echo # Additional test for WL#3726 "DDL locking for all metadata objects"
 | |
| --echo # Check that DDL and DML statements waiting for metadata locks can
 | |
| --echo # be killed. Note that we don't cover all situations here since it
 | |
| --echo # can be tricky to write test case for some of them (e.g. REPAIR or
 | |
| --echo # ALTER and other statements under LOCK TABLES).
 | |
| --echo #
 | |
| 
 | |
| create table t1 (i int primary key);
 | |
| connect (blocker, localhost, root, , );
 | |
| connect (dml, localhost, root, , );
 | |
| connect (ddl, localhost, root, , );
 | |
| 
 | |
| --echo # Test for RENAME TABLE
 | |
| connection blocker;
 | |
| lock table t1 read;
 | |
| connection ddl;
 | |
| let $ID= `select connection_id()`;
 | |
| --send rename table t1 to t2
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "rename table t1 to t2";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| --echo # Test for DROP TABLE
 | |
| --send drop table t1
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "drop table t1";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| --echo # Test for CREATE TRIGGER
 | |
| --send create trigger t1_bi before insert on t1 for each row set @a:=1
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "create trigger t1_bi before insert on t1 for each row set @a:=1";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| --echo #
 | |
| --echo # Tests for various kinds of ALTER TABLE
 | |
| --echo #
 | |
| --echo # Full-blown ALTER which should copy table
 | |
| --send alter table t1 add column j int
 | |
| connection default;
 | |
| 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
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| --echo # Two kinds of simple ALTER
 | |
| --send alter table t1 rename to t2
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 rename to t2";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| --send alter table t1 disable keys
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 disable keys";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| --echo # Fast ALTER
 | |
| --send alter table t1 alter column i set default 100
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t1 alter column i set default 100";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| --echo # Special case which is triggered only for MERGE tables.
 | |
| connection blocker;
 | |
| unlock tables;
 | |
| create table t2 (i int primary key) engine=merge union=(t1);
 | |
| lock tables t2 read;
 | |
| connection ddl;
 | |
| --send alter table t2 alter column i set default 100
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "alter table t2 alter column i set default 100";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID ID
 | |
| eval kill query $ID;
 | |
| connection ddl;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| 
 | |
| --echo # Test for DML waiting for meta-data lock
 | |
| connection blocker;
 | |
| unlock tables;
 | |
| lock tables t1 read;
 | |
| connection ddl;
 | |
| # Let us add pending exclusive metadata lock on t2
 | |
| --send truncate table t1
 | |
| connection dml;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "truncate table t1";
 | |
| --source include/wait_condition.inc
 | |
| let $ID2= `select connection_id()`;
 | |
| --send insert into t1 values (1)
 | |
| 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)";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID2 ID2
 | |
| eval kill query $ID2;
 | |
| connection dml;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| connection blocker;
 | |
| unlock tables;
 | |
| connection ddl;
 | |
| --reap
 | |
| 
 | |
| --echo # Test for DML waiting for tables to be flushed
 | |
| connection blocker;
 | |
| lock tables t1 read;
 | |
| connection ddl;
 | |
| --echo # Let us mark locked table t1 as old
 | |
| --send flush tables t1
 | |
| connection dml;
 | |
| 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
 | |
| --send select * from t1
 | |
| connection default;
 | |
| let $wait_condition=
 | |
|   select count(*) = 1 from information_schema.processlist
 | |
|   where state = "Waiting for table metadata lock" and
 | |
|         info = "select * from t1";
 | |
| --source include/wait_condition.inc
 | |
| --replace_result $ID2 ID2
 | |
| eval kill query $ID2;
 | |
| connection dml;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| --reap
 | |
| connection blocker;
 | |
| unlock tables;
 | |
| connection ddl;
 | |
| --reap
 | |
| 
 | |
| --echo # Cleanup.
 | |
| connection default;
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| 
 | |
| ###########################################################################
 | |
| 
 | |
| --echo #
 | |
| --echo # Test kill USER
 | |
| --echo #
 | |
| --source include/count_sessions.inc
 | |
| grant ALL on test.* to test@localhost;
 | |
| grant ALL on test.* to test2@localhost;
 | |
| connect (con3, localhost, test,,);
 | |
| connect (con4, localhost, test2,,);
 | |
| connection default;
 | |
| --enable_info
 | |
| kill hard query user test2@nohost;
 | |
| kill soft query user test@localhost;
 | |
| kill hard query user test@localhost;
 | |
| kill soft connection user test2;
 | |
| kill hard connection user test@localhost;
 | |
| --disable_info
 | |
| revoke all privileges on test.* from test@localhost;
 | |
| revoke all privileges on test.* from test2@localhost;
 | |
| drop user test@localhost;
 | |
| drop user test2@localhost;
 | |
| 
 | |
| connection con3;
 | |
| --error 2013,2006,5014
 | |
| select 1;
 | |
| connection con4;
 | |
| --error 2013,2006,5014
 | |
| select 1;
 | |
| connection default;
 | |
| --source include/wait_until_count_sessions.inc
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-4911 - add KILL query id, and add query id information to
 | |
| --echo #             processlist
 | |
| --echo #
 | |
| send SELECT SLEEP(1000);
 | |
| connection con1;
 | |
| let $wait_condition= SELECT @id:=QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO='SELECT SLEEP(1000)' AND STATE='User sleep';
 | |
| source include/wait_condition.inc;
 | |
| KILL QUERY ID @id;
 | |
| connection default;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| reap;
 | |
| 
 | |
| --error ER_NO_SUCH_QUERY
 | |
| KILL QUERY ID 0;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-5096 - Wrong error message on attempt to kill somebody else's
 | |
| --echo #             query ID
 | |
| --echo #
 | |
| CREATE USER u1@localhost;
 | |
| send SELECT SLEEP(1000);
 | |
| 
 | |
| connection con1;
 | |
| let $wait_condition= SELECT @id:=QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO='SELECT SLEEP(1000)' AND STATE='User sleep';
 | |
| source include/wait_condition.inc;
 | |
| let $id= `SELECT @id`;
 | |
| 
 | |
| connect(con5, localhost, u1,,);
 | |
| --replace_result $id ID
 | |
| --error ER_KILL_QUERY_DENIED_ERROR
 | |
| eval KILL QUERY ID $id;
 | |
| 
 | |
| connection con1;
 | |
| KILL QUERY ID @id;
 | |
| 
 | |
| connection default;
 | |
| --error ER_QUERY_INTERRUPTED
 | |
| reap;
 | |
| disconnect con5;
 | |
| DROP USER u1@localhost;
 | |
| 
 | |
| set global sql_mode=default;
 | |
| disconnect con1;
 | |
| disconnect con2;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-17998
 | |
| --echo # Deadlock and eventual Assertion `!table->pos_in_locked_tables' failed
 | |
| --echo # in tc_release_table on KILL_TIMEOUT
 | |
| --echo #
 | |
| 
 | |
| SET max_statement_time= 2;
 | |
| 
 | |
| CREATE TABLE t1 (a INT);
 | |
| CREATE VIEW v1 AS SELECT * FROM t1;
 | |
| CREATE TABLE t2 (b INT, c INT);
 | |
|  
 | |
| LOCK TABLES v1 READ, t2 WRITE, t1 WRITE;
 | |
| --error ER_BAD_FIELD_ERROR,ER_STATEMENT_TIMEOUT
 | |
| ALTER TABLE t1 CHANGE f1 f2 DOUBLE;
 | |
| ALTER TABLE t2 DROP c;
 | |
| UNLOCK TABLES;
 | |
| DROP VIEW v1;
 | |
| DROP TABLE t1, t2;
 | |
| 
 | |
| --echo #
 | |
| --echo # KILL QUERY ID USER
 | |
| --echo #
 | |
| --error ER_BAD_FIELD_ERROR
 | |
| kill query id user 'foo';
 | |
| --enable_service_connection
 | 
