mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +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
|