1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
|
#
# Test KILL and KILL QUERY statements.
#
-- 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';
--source include/turn_off_only_full_group_by.inc
# This is a very long running query. If this test start failing,
# it may be necessary to change to an even longer query.
# Hash join will make the query run too long before hitting the DEBUG_SYNC-point
# 'before_acos_function', because the hash join iterator will materialize a lot
# of data before we get so far.
send SELECT id FROM t1 WHERE id IN
(SELECT /*+ NO_BNL(a,b,c,d) */ 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#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;
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 ;
}
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 WAIT_FOR continue';
eval PREPARE stmt FROM 'EXPLAIN SELECT * $from $where';
send EXECUTE stmt;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
SET DEBUG_SYNC= 'now SIGNAL continue';
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_QUERY_INTERRUPTED
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;
disconnect con1;
SET DEBUG_SYNC = 'RESET';
###########################################################################
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL;
--echo #
--echo # Bug#12661349 assert in protocol::end_statement
--echo #
--echo # Note: This test case should be run with --ps-protocol
CREATE TABLE t1 (col1 INT);
--enable_connect_log
--connect(con1, localhost, root)
--let $con1_id= `SELECT CONNECTION_ID()`
SET DEBUG_SYNC= 'before_execute_sql_command SIGNAL waiting WAIT_FOR killed';
--send SELECT * FROM t1
--connection default
SET DEBUG_SYNC= 'now WAIT_FOR waiting';
--replace_result $con1_id <con1_id>
--eval KILL QUERY $con1_id
SET DEBUG_SYNC= 'now SIGNAL killed';
--connection con1
# Here the server asserts when running with "--ps-protocol"
--error ER_QUERY_INTERRUPTED
--reap
--disconnect con1
--source include/wait_until_disconnected.inc
--connection default
DROP TABLE t1;
--disable_connect_log
SET DEBUG_SYNC= 'RESET';
|