kill.test 8.62 KB
Newer Older
1
#
2 3 4 5 6 7 8 9
# 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.
#

10
-- source include/not_embedded.inc
11 12
set local sql_mode="";
set global sql_mode="";
13

Sergei Golubchik's avatar
Sergei Golubchik committed
14 15
connect con1, localhost, root;
connect con2, localhost, root;
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
--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
39 40
  where state = "Waiting for table metadata lock" and
        info = "rename table t1 to t2";
41 42 43 44 45 46 47 48 49 50 51 52
--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
53
  where state = "Waiting for table metadata lock" and
54
        info = "drop table t1";
Konstantin Osipov's avatar
Konstantin Osipov committed
55
--source include/wait_condition.inc
56 57 58 59 60 61 62 63 64 65 66
--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
67
  where state = "Waiting for table metadata lock" and
68
        info = "create trigger t1_bi before insert on t1 for each row set @a:=1";
Konstantin Osipov's avatar
Konstantin Osipov committed
69
--source include/wait_condition.inc
70 71 72 73 74 75 76 77 78 79 80 81 82 83
--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
84
  where state = "Waiting for table metadata lock" and
85
        info = "alter table t1 add column j int";
Konstantin Osipov's avatar
Konstantin Osipov committed
86
--source include/wait_condition.inc
87 88 89 90 91 92 93 94 95 96 97
--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
98
  where state = "Waiting for table metadata lock" and
99
        info = "alter table t1 rename to t2";
Konstantin Osipov's avatar
Konstantin Osipov committed
100
--source include/wait_condition.inc
101 102 103 104 105 106 107 108 109
--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
110
  where state = "Waiting for table metadata lock" and
111
        info = "alter table t1 disable keys";
Konstantin Osipov's avatar
Konstantin Osipov committed
112
--source include/wait_condition.inc
113 114 115 116 117 118 119 120 121 122
--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
123
  where state = "Waiting for table metadata lock" and
124
        info = "alter table t1 alter column i set default 100";
Konstantin Osipov's avatar
Konstantin Osipov committed
125
--source include/wait_condition.inc
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
--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
141
  where state = "Waiting for table metadata lock" and
142
        info = "alter table t2 alter column i set default 100";
Konstantin Osipov's avatar
Konstantin Osipov committed
143
--source include/wait_condition.inc
144 145 146 147 148 149 150 151 152 153 154 155
--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
156
--send truncate table t1
157 158 159
connection dml;
let $wait_condition=
  select count(*) = 1 from information_schema.processlist
160
  where state = "Waiting for table metadata lock" and
161
        info = "truncate table t1";
Konstantin Osipov's avatar
Konstantin Osipov committed
162
--source include/wait_condition.inc
163
let $ID2= `select connection_id()`;
164
--send insert into t1 values (1)
165 166 167
connection default;
let $wait_condition=
  select count(*) = 1 from information_schema.processlist
168
  where state = "Waiting for table metadata lock" and
169
        info = "insert into t1 values (1)";
Konstantin Osipov's avatar
Konstantin Osipov committed
170
--source include/wait_condition.inc
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
--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
186
--send flush tables t1
187 188 189
connection dml;
let $wait_condition=
  select count(*) = 1 from information_schema.processlist
190 191
  where state = "Waiting for table metadata lock" and
        info = "flush tables t1";
Konstantin Osipov's avatar
Konstantin Osipov committed
192
--source include/wait_condition.inc
193 194 195 196
--send select * from t1
connection default;
let $wait_condition=
  select count(*) = 1 from information_schema.processlist
197
  where state = "Waiting for table metadata lock" and
198
        info = "select * from t1";
Konstantin Osipov's avatar
Konstantin Osipov committed
199
--source include/wait_condition.inc
200 201 202 203 204 205 206 207 208 209 210 211 212
--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;
213
drop table t2;
214

215 216
###########################################################################

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
--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;
Georg Richter's avatar
Georg Richter committed
238
--error 2013,2006,5014
239 240
select 1;
connection con4;
Georg Richter's avatar
Georg Richter committed
241
--error 2013,2006,5014
242 243 244
select 1;
connection default;

245 246 247 248 249 250 251 252 253 254
--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)';
source include/wait_condition.inc;
KILL QUERY ID @id;
connection default;
255
--error ER_QUERY_INTERRUPTED
256 257
reap;

258 259 260
--error ER_NO_SUCH_QUERY
KILL QUERY ID 0;

261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
--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)';
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;
282
--error ER_QUERY_INTERRUPTED
283 284 285 286
reap;
disconnect con5;
DROP USER u1@localhost;

287
set global sql_mode=default;
Sergei Golubchik's avatar
Sergei Golubchik committed
288 289
disconnect con1;
disconnect con2;
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

--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;
310 311 312 313

--echo #
--echo # KILL QUERY ID USER
--echo #
314
--error ER_BAD_FIELD_ERROR
315
kill query id user 'foo';