diff --git a/mysql-test/main/kill.result b/mysql-test/main/kill.result index 5d38bd90059..797052710e8 100644 --- a/mysql-test/main/kill.result +++ b/mysql-test/main/kill.result @@ -1,225 +1,7 @@ set local sql_mode=""; set global sql_mode=""; -SET DEBUG_SYNC = 'RESET'; -DROP TABLE IF EXISTS t1, t2, t3; -DROP FUNCTION IF EXISTS MY_KILL; -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| -connect con1, localhost, root,,; -connect con2, localhost, root,,; -connection con1; -connection con2; -connection con1; -SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; -SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read'; -connection con2; -SET DEBUG_SYNC='now WAIT_FOR con1_read'; -SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; -SET DEBUG_SYNC = 'RESET'; -connection con1; -SELECT 1; -Got one of the listed errors -SELECT 1; -1 -1 -SELECT @id != CONNECTION_ID(); -@id != CONNECTION_ID() -1 -connection con2; -SELECT 4; -4 -4 -connection default; -KILL (SELECT COUNT(*) FROM mysql.user); -ERROR 42000: KILL does not support subqueries or stored functions -connection con1; -connection con2; -connection con1; -SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; -SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill'; -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR con1_read'; -SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; -SET DEBUG_SYNC = 'RESET'; -connection con1; -SELECT 1; -Got one of the listed errors -SELECT 1; -1 -1 -SELECT @id != CONNECTION_ID(); -@id != CONNECTION_ID() -1 -connection con2; -SELECT 4; -4 -4 -connection default; -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; -connection con2; -connection con1; -SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; -SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync'; -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; -Got one of the listed errors -SELECT 1; -1 -1 -connection default; -SET DEBUG_SYNC = 'RESET'; -DROP TABLE t1, t2; -connection con1; -connection con2; -connection con1; -SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill'; -SELECT ACOS(0); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ACOS(0) -1.5707963267948966 -SELECT 1; -1 -1 -SELECT @id = CONNECTION_ID(); -@id = CONNECTION_ID() -1 -connection default; -SET DEBUG_SYNC = 'RESET'; -CREATE TABLE t1 (f1 INT); -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| -connection con1; -connection con2; -connection con1; -INSERT INTO t1 VALUES (bug27563()); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ERROR 70100: Query execution was interrupted -SELECT * FROM t1; -f1 -connection default; -SET DEBUG_SYNC = 'RESET'; -INSERT INTO t1 VALUES(0); -connection con1; -UPDATE t1 SET f1= bug27563(); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ERROR 70100: Query execution was interrupted -SELECT * FROM t1; -f1 -0 -connection default; -SET DEBUG_SYNC = 'RESET'; -INSERT INTO t1 VALUES(1); -connection con1; -DELETE FROM t1 WHERE bug27563() IS NULL; -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ERROR 70100: Query execution was interrupted -SELECT * FROM t1; -f1 -0 -1 -connection default; -SET DEBUG_SYNC = 'RESET'; -connection con1; -SELECT * FROM t1 WHERE f1= bug27563(); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ERROR 70100: Query execution was interrupted -SELECT * FROM t1; -f1 -0 -1 -connection default; -SET DEBUG_SYNC = 'RESET'; -DROP FUNCTION bug27563; -CREATE TABLE t2 (f2 INT); -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| -connection con1; -INSERT INTO t1 VALUES(2),(3); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; -KILL QUERY @id; -connection con1; -ERROR 70100: Query execution was interrupted -SELECT * FROM t1; -f1 -0 -1 -SELECT * FROM t2; -f2 -0 -connection default; -SET DEBUG_SYNC = 'RESET'; -DROP TABLE t1, t2; -# -# Bug#19723: kill of active connection yields different error code -# depending on platform. -# -connection con1; -SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; -KILL @id; -ERROR 70100: Connection was killed -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; -connection con1; -# ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST, -# depending on the timing of close of the connection socket -SELECT 1; -Got one of the listed errors -SELECT 1; -1 -1 -SELECT @id != CONNECTION_ID(); -@id != CONNECTION_ID() -1 -connection default; -SET DEBUG_SYNC = 'RESET'; +connect con1, localhost, root; +connect con2, localhost, root; # # Additional test for WL#3726 "DDL locking for all metadata objects" # Check that DDL and DML statements waiting for metadata locks can @@ -227,7 +9,6 @@ SET DEBUG_SYNC = 'RESET'; # can be tricky to write test case for some of them (e.g. REPAIR or # ALTER and other statements under LOCK TABLES). # -drop tables if exists t1, t2, t3; create table t1 (i int primary key); connect blocker, localhost, root, , ; connect dml, localhost, root, , ; @@ -380,9 +161,9 @@ connection default; ERROR 70100: Query execution was interrupted disconnect con5; DROP USER u1@localhost; -SET DEBUG_SYNC = 'RESET'; -DROP FUNCTION MY_KILL; set global sql_mode=default; +disconnect con1; +disconnect con2; # # MDEV-17998 # Deadlock and eventual Assertion `!table->pos_in_locked_tables' failed diff --git a/mysql-test/main/kill.test b/mysql-test/main/kill.test index 7dc57158825..e40918ee6b2 100644 --- a/mysql-test/main/kill.test +++ b/mysql-test/main/kill.test @@ -8,294 +8,11 @@ # -- source include/not_embedded.inc --- source include/have_debug_sync.inc set local sql_mode=""; set global sql_mode=""; ---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,5014 -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_SUBQUERIES_NOT_SUPPORTED -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,5014 -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,5014 -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; - ---echo # ---echo # Bug#19723: kill of active connection yields different error code ---echo # depending on platform. ---echo # - ---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,5014 -SELECT 1; ---enable_reconnect -SELECT 1; -let $ignore= `SELECT @id := $ID`; -SELECT @id != CONNECTION_ID(); -connection default; -SET DEBUG_SYNC = 'RESET'; +connect con1, localhost, root; +connect con2, localhost, root; --echo # --echo # Additional test for WL#3726 "DDL locking for all metadata objects" @@ -304,9 +21,6 @@ SET DEBUG_SYNC = 'RESET'; --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, , ); @@ -570,11 +284,9 @@ reap; disconnect con5; DROP USER u1@localhost; - -SET DEBUG_SYNC = 'RESET'; -DROP FUNCTION MY_KILL; - set global sql_mode=default; +disconnect con1; +disconnect con2; --echo # --echo # MDEV-17998 diff --git a/mysql-test/main/kill_debug.result b/mysql-test/main/kill_debug.result new file mode 100644 index 00000000000..d0fadb5c7b5 --- /dev/null +++ b/mysql-test/main/kill_debug.result @@ -0,0 +1,223 @@ +set local sql_mode=""; +set global sql_mode=""; +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| +connect con1, localhost, root; +connect con2, localhost, root; +connection con1; +connection con2; +connection con1; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read'; +connection con2; +SET DEBUG_SYNC='now WAIT_FOR con1_read'; +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +SET DEBUG_SYNC = 'RESET'; +connection con1; +SELECT 1; +Got one of the listed errors +SELECT 1; +1 +1 +SELECT @id != CONNECTION_ID(); +@id != CONNECTION_ID() +1 +connection con2; +SELECT 4; +4 +4 +connection default; +KILL (SELECT COUNT(*) FROM mysql.user); +ERROR 42000: KILL does not support subqueries or stored functions +connection con1; +connection con2; +connection con1; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill'; +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR con1_read'; +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +SET DEBUG_SYNC = 'RESET'; +connection con1; +SELECT 1; +Got one of the listed errors +SELECT 1; +1 +1 +SELECT @id != CONNECTION_ID(); +@id != CONNECTION_ID() +1 +connection con2; +SELECT 4; +4 +4 +connection default; +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; +connection con2; +connection con1; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync'; +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; +Got one of the listed errors +SELECT 1; +1 +1 +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1, t2; +connection con1; +connection con2; +connection con1; +SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill'; +SELECT ACOS(0); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ACOS(0) +1.5707963267948966 +SELECT 1; +1 +1 +SELECT @id = CONNECTION_ID(); +@id = CONNECTION_ID() +1 +connection default; +SET DEBUG_SYNC = 'RESET'; +CREATE TABLE t1 (f1 INT); +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| +connection con1; +connection con2; +connection con1; +INSERT INTO t1 VALUES (bug27563()); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT * FROM t1; +f1 +connection default; +SET DEBUG_SYNC = 'RESET'; +INSERT INTO t1 VALUES(0); +connection con1; +UPDATE t1 SET f1= bug27563(); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT * FROM t1; +f1 +0 +connection default; +SET DEBUG_SYNC = 'RESET'; +INSERT INTO t1 VALUES(1); +connection con1; +DELETE FROM t1 WHERE bug27563() IS NULL; +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT * FROM t1; +f1 +0 +1 +connection default; +SET DEBUG_SYNC = 'RESET'; +connection con1; +SELECT * FROM t1 WHERE f1= bug27563(); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT * FROM t1; +f1 +0 +1 +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP FUNCTION bug27563; +CREATE TABLE t2 (f2 INT); +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| +connection con1; +INSERT INTO t1 VALUES(2),(3); +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +ERROR 70100: Query execution was interrupted +SELECT * FROM t1; +f1 +0 +1 +SELECT * FROM t2; +f2 +0 +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1, t2; +# +# Bug#19723: kill of active connection yields different error code +# depending on platform. +# +connection con1; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +KILL @id; +ERROR 70100: Connection was killed +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +connection con1; +# ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST, +# depending on the timing of close of the connection socket +SELECT 1; +Got one of the listed errors +SELECT 1; +1 +1 +SELECT @id != CONNECTION_ID(); +@id != CONNECTION_ID() +1 +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP FUNCTION MY_KILL; +set global sql_mode=default; +disconnect con1; +disconnect con2; diff --git a/mysql-test/main/kill_debug.test b/mysql-test/main/kill_debug.test new file mode 100644 index 00000000000..ba6a0ced528 --- /dev/null +++ b/mysql-test/main/kill_debug.test @@ -0,0 +1,298 @@ +# +# 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 +set local sql_mode=""; +set global sql_mode=""; + +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,5014 +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_SUBQUERIES_NOT_SUPPORTED +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,5014 +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,5014 +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; + +--echo # +--echo # Bug#19723: kill of active connection yields different error code +--echo # depending on platform. +--echo # + +--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,5014 +SELECT 1; +--enable_reconnect +SELECT 1; +let $ignore= `SELECT @id := $ID`; +SELECT @id != CONNECTION_ID(); +connection default; + +SET DEBUG_SYNC = 'RESET'; +DROP FUNCTION MY_KILL; + +set global sql_mode=default; +disconnect con1; +disconnect con2;