mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			637 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			637 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#
 | 
						|
# 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/not_embedded.inc
 | 
						|
-- source include/have_debug_sync.inc
 | 
						|
-- source include/not_threadpool.inc
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
DROP TABLE IF EXISTS t1, t2, t3;
 | 
						|
DROP FUNCTION IF EXISTS MY_KILL;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
delimiter |;
 | 
						|
# Helper function used to repeatedly kill a session.
 | 
						|
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
 | 
						|
BEGIN
 | 
						|
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
 | 
						|
  KILL tid;
 | 
						|
  RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
 | 
						|
END|
 | 
						|
delimiter ;|
 | 
						|
 | 
						|
connect (con1, localhost, root,,);
 | 
						|
connect (con2, localhost, root,,);
 | 
						|
 | 
						|
# Save id of con1
 | 
						|
connection con1;
 | 
						|
--disable_reconnect
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
connection con1;
 | 
						|
# Signal when this connection is terminating.
 | 
						|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
 | 
						|
# See if we can kill read().
 | 
						|
# Run into read() immediately after hitting 'before_do_command_net_read'.
 | 
						|
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
 | 
						|
 | 
						|
# Kill con1
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC='now WAIT_FOR con1_read';
 | 
						|
# At this point we have no way to figure out, when con1 is blocked in
 | 
						|
# reading from the socket. Sending KILL to early would not terminate
 | 
						|
# con1. So we repeat KILL until con1 terminates.
 | 
						|
let $wait_condition= SELECT MY_KILL(@id);
 | 
						|
--source include/wait_condition.inc
 | 
						|
# If KILL missed the read(), sync point wait will time out.
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
connection con1;
 | 
						|
--error 1053,2006,2013
 | 
						|
SELECT 1;
 | 
						|
 | 
						|
--enable_reconnect
 | 
						|
# this should work, and we should have a new connection_id()
 | 
						|
SELECT 1;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
SELECT @id != CONNECTION_ID();
 | 
						|
 | 
						|
#make sure the server is still alive
 | 
						|
connection con2;
 | 
						|
SELECT 4;
 | 
						|
connection default;
 | 
						|
 | 
						|
--error ER_NOT_SUPPORTED_YET
 | 
						|
KILL (SELECT COUNT(*) FROM mysql.user);
 | 
						|
 | 
						|
connection con1;
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
connection con1;
 | 
						|
disable_reconnect;
 | 
						|
# Signal when this connection is terminating.
 | 
						|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
 | 
						|
# See if we can kill the sync point itself.
 | 
						|
# Wait in 'before_do_command_net_read' until killed.
 | 
						|
# It doesn't wait for a signal 'kill' but for to be killed.
 | 
						|
# The signal name doesn't matter here.
 | 
						|
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
 | 
						|
# Repeat KILL until con1 terminates.
 | 
						|
let $wait_condition= SELECT MY_KILL(@id);
 | 
						|
--source include/wait_condition.inc
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
connection con1;
 | 
						|
--error 1053,2006,2013
 | 
						|
SELECT 1;
 | 
						|
enable_reconnect;
 | 
						|
SELECT 1;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
SELECT @id != CONNECTION_ID();
 | 
						|
connection con2;
 | 
						|
SELECT 4;
 | 
						|
connection default;
 | 
						|
 | 
						|
#
 | 
						|
# BUG#14851: killing long running subquery processed via a temporary table.
 | 
						|
#
 | 
						|
 | 
						|
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
 | 
						|
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
 | 
						|
 | 
						|
INSERT INTO t1 VALUES
 | 
						|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
 | 
						|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
 | 
						|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
 | 
						|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
 | 
						|
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
 | 
						|
 | 
						|
INSERT INTO t2 SELECT id FROM t1;
 | 
						|
 | 
						|
connection con1;
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
 | 
						|
connection con1;
 | 
						|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
 | 
						|
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
 | 
						|
# This is a very long running query. If this test start failing,
 | 
						|
# it may be necessary to change to an even longer query.
 | 
						|
send SELECT id FROM t1 WHERE id IN
 | 
						|
       (SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
 | 
						|
          GROUP BY ACOS(1/a.id), b.id, c.id, d.id
 | 
						|
          HAVING a.id BETWEEN 10 AND 20);
 | 
						|
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL @id;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
 | 
						|
 | 
						|
connection con1;
 | 
						|
--error 1317,1053,2006,2013
 | 
						|
reap;
 | 
						|
SELECT 1;
 | 
						|
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
DROP TABLE t1, t2;
 | 
						|
 | 
						|
#
 | 
						|
# Test of blocking of sending ERROR after OK or EOF
 | 
						|
#
 | 
						|
connection con1;
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
connection con1;
 | 
						|
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
 | 
						|
send SELECT ACOS(0);
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
reap;
 | 
						|
SELECT 1;
 | 
						|
SELECT @id = CONNECTION_ID();
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
#
 | 
						|
# Bug#27563: Stored functions and triggers wasn't throwing an error when killed.
 | 
						|
#
 | 
						|
CREATE TABLE t1 (f1 INT);
 | 
						|
delimiter |;
 | 
						|
CREATE FUNCTION bug27563() RETURNS INT(11)
 | 
						|
DETERMINISTIC
 | 
						|
BEGIN
 | 
						|
  DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
 | 
						|
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
 | 
						|
  SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
 | 
						|
  RETURN 1;
 | 
						|
END|
 | 
						|
delimiter ;|
 | 
						|
# Test stored functions
 | 
						|
# Test INSERT
 | 
						|
connection con1;
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
connection con1;
 | 
						|
send INSERT INTO t1 VALUES (bug27563());
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
SELECT * FROM t1;
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
# Test UPDATE
 | 
						|
INSERT INTO t1 VALUES(0);
 | 
						|
connection con1;
 | 
						|
send UPDATE t1 SET f1= bug27563();
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
SELECT * FROM t1;
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
# Test DELETE
 | 
						|
INSERT INTO t1 VALUES(1);
 | 
						|
connection con1;
 | 
						|
send DELETE FROM t1 WHERE bug27563() IS NULL;
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
SELECT * FROM t1;
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
# Test SELECT
 | 
						|
connection con1;
 | 
						|
send SELECT * FROM t1 WHERE f1= bug27563();
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
SELECT * FROM t1;
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
DROP FUNCTION bug27563;
 | 
						|
 | 
						|
# Test TRIGGERS
 | 
						|
CREATE TABLE t2 (f2 INT);
 | 
						|
delimiter |;
 | 
						|
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
 | 
						|
BEGIN
 | 
						|
  DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
 | 
						|
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
 | 
						|
  INSERT INTO t2 VALUES(0);
 | 
						|
  SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
 | 
						|
  INSERT INTO t2 VALUES(1);
 | 
						|
END|
 | 
						|
delimiter ;|
 | 
						|
connection con1;
 | 
						|
send INSERT INTO t1 VALUES(2),(3);
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
SELECT * FROM t1;
 | 
						|
SELECT * FROM t2;
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
DROP TABLE t1, t2;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#28598: mysqld crash when killing a long-running explain query.
 | 
						|
#
 | 
						|
connection con1;
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
connection con2;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
connection con1;
 | 
						|
--disable_query_log
 | 
						|
let $tab_count= 40;
 | 
						|
 | 
						|
--disable_query_log
 | 
						|
begin;
 | 
						|
let $i= $tab_count;
 | 
						|
while ($i)
 | 
						|
{
 | 
						|
  eval CREATE TABLE t$i (a$i INT, KEY(a$i));
 | 
						|
  eval INSERT INTO t$i VALUES (1),(2),(3),(4),(5),(6),(7);
 | 
						|
  dec $i ;
 | 
						|
}
 | 
						|
 | 
						|
commit;
 | 
						|
--enable_query_log
 | 
						|
 | 
						|
SET SESSION optimizer_search_depth=0;
 | 
						|
 | 
						|
let $i=$tab_count;
 | 
						|
while ($i)
 | 
						|
{
 | 
						|
  let $a= a$i;
 | 
						|
  let $t= t$i;
 | 
						|
  dec $i;
 | 
						|
  if ($i)
 | 
						|
  {
 | 
						|
    let $comma=,;
 | 
						|
    let $from=$comma$t$from;
 | 
						|
    let $where=a$i=$a $and $where;
 | 
						|
  }
 | 
						|
  if (!$i)
 | 
						|
  {
 | 
						|
    let $from=FROM $t$from;
 | 
						|
    let $where=WHERE $where;
 | 
						|
  }
 | 
						|
  let $and=AND;
 | 
						|
}
 | 
						|
 | 
						|
--enable_query_log
 | 
						|
SET DEBUG_SYNC= 'before_join_optimize SIGNAL in_sync';
 | 
						|
eval PREPARE stmt FROM 'EXPLAIN SELECT * $from $where';
 | 
						|
send EXECUTE stmt;
 | 
						|
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
 | 
						|
KILL QUERY @id;
 | 
						|
connection con1;
 | 
						|
--error 1317
 | 
						|
reap;
 | 
						|
--disable_query_log
 | 
						|
let $i= $tab_count;
 | 
						|
while ($i)
 | 
						|
{
 | 
						|
  eval DROP TABLE t$i;
 | 
						|
  dec $i ;
 | 
						|
}
 | 
						|
--enable_query_log
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Bug#19723: kill of active connection yields different error code
 | 
						|
--echo # depending on platform.
 | 
						|
--echo #
 | 
						|
 | 
						|
--echo
 | 
						|
--echo # Connection: con1.
 | 
						|
--connection con1
 | 
						|
let $ID= `SELECT @id := CONNECTION_ID()`;
 | 
						|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
 | 
						|
--disable_reconnect
 | 
						|
--error ER_CONNECTION_KILLED
 | 
						|
KILL @id;
 | 
						|
 | 
						|
connection con2;
 | 
						|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
 | 
						|
connection con1;
 | 
						|
--echo # ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
 | 
						|
--echo # depending on the timing of close of the connection socket
 | 
						|
--error 1053,2006,2013
 | 
						|
SELECT 1;
 | 
						|
--enable_reconnect
 | 
						|
SELECT 1;
 | 
						|
let $ignore= `SELECT @id := $ID`;
 | 
						|
SELECT @id != CONNECTION_ID();
 | 
						|
connection default;
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
 | 
						|
--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 #
 | 
						|
--disable_warnings
 | 
						|
drop tables if exists t1, t2, t3;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
create table t1 (i int primary key);
 | 
						|
connect (blocker, localhost, root, , );
 | 
						|
connect (dml, localhost, root, , );
 | 
						|
connect (ddl, localhost, root, , );
 | 
						|
 | 
						|
--echo # Test for RENAME TABLE
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
lock table t1 read;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
let $ID= `select connection_id()`;
 | 
						|
--send rename table t1 to t2
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
 | 
						|
--echo # Test for DROP TABLE
 | 
						|
--send drop table t1
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
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
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
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
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
 | 
						|
--echo # Two kinds of simple ALTER
 | 
						|
--send alter table t1 rename to t2
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
--send alter table t1 disable keys
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
--echo # Fast ALTER
 | 
						|
--send alter table t1 alter column i set default 100
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
--echo # Special case which is triggered only for MERGE tables.
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
unlock tables;
 | 
						|
create table t2 (i int primary key) engine=merge union=(t1);
 | 
						|
lock tables t2 read;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--send alter table t2 alter column i set default 100
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
 | 
						|
--echo # Test for DML waiting for meta-data lock
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
unlock tables;
 | 
						|
lock tables t1 read;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
# Let us add pending exclusive metadata lock on t2
 | 
						|
--send truncate table t1
 | 
						|
--echo # Switching to connection 'dml'
 | 
						|
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)
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
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;
 | 
						|
--echo # Switching to connection 'dml'
 | 
						|
connection dml;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
unlock tables;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--reap
 | 
						|
 | 
						|
--echo # Test for DML waiting for tables to be flushed
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
lock tables t1 read;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--echo # Let us mark locked table t1 as old
 | 
						|
--send flush tables
 | 
						|
--echo # Switching to connection 'dml'
 | 
						|
connection dml;
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Waiting for table flush" and
 | 
						|
        info = "flush tables";
 | 
						|
--source include/wait_condition.inc
 | 
						|
--send select * from t1
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
connection default;
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Waiting for table flush" and
 | 
						|
        info = "select * from t1";
 | 
						|
--source include/wait_condition.inc
 | 
						|
--replace_result $ID2 ID2
 | 
						|
eval kill query $ID2;
 | 
						|
--echo # Switching to connection 'dml'
 | 
						|
connection dml;
 | 
						|
--error ER_QUERY_INTERRUPTED
 | 
						|
--reap
 | 
						|
--echo # Switching to connection 'blocker'
 | 
						|
connection blocker;
 | 
						|
unlock tables;
 | 
						|
--echo # Switching to connection 'ddl'
 | 
						|
connection ddl;
 | 
						|
--reap
 | 
						|
 | 
						|
--echo # Cleanup.
 | 
						|
--echo # Switching to connection 'default'
 | 
						|
connection default;
 | 
						|
drop table t1;
 | 
						|
drop table t2;
 | 
						|
 | 
						|
###########################################################################
 | 
						|
 | 
						|
--echo #
 | 
						|
--echo # Test kill USER
 | 
						|
--echo #
 | 
						|
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
 | 
						|
select 1;
 | 
						|
connection con4;
 | 
						|
--error 2013,2006
 | 
						|
select 1;
 | 
						|
connection default;
 | 
						|
 | 
						|
SET DEBUG_SYNC = 'RESET';
 | 
						|
DROP FUNCTION MY_KILL;
 |