diff options
Diffstat (limited to 'mysql-test/main/kill.test')
-rw-r--r-- | mysql-test/main/kill.test | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/mysql-test/main/kill.test b/mysql-test/main/kill.test new file mode 100644 index 00000000..e89bdb22 --- /dev/null +++ b/mysql-test/main/kill.test @@ -0,0 +1,322 @@ +# +# 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 |