Commit 1a2a9d74 authored by Sergey Vojtovich's avatar Sergey Vojtovich

MDEV-4911 - add KILL query id, and add query id information to processlist

It is now possible to kill query by query id. KILL syntax was extended to:
KILL [HARD | SOFT] [CONNECTION | QUERY [ID query_id]] [thread_id | USER user_name]

Added QUERY_ID column to INFORMATION_SCHEMA.PROCESSLIST.

Fixed tests affected by this change:
- added PROCESSLIST.QUERY_ID column
- ID is now keyword and is quoted in SHOW CREATE TABLE output
- PFS statement digest is calculated basing on token id
  (not token text). Token id has shifted for keywords residing
  after ID in keywords array.
parent 7a80c534
...@@ -1764,7 +1764,8 @@ t1 CREATE TABLE `t1` ( ...@@ -1764,7 +1764,8 @@ t1 CREATE TABLE `t1` (
`MAX_STAGE` tinyint(2) NOT NULL DEFAULT '0', `MAX_STAGE` tinyint(2) NOT NULL DEFAULT '0',
`PROGRESS` decimal(7,3) NOT NULL DEFAULT '0.000', `PROGRESS` decimal(7,3) NOT NULL DEFAULT '0.000',
`MEMORY_USED` int(7) NOT NULL DEFAULT '0', `MEMORY_USED` int(7) NOT NULL DEFAULT '0',
`EXAMINED_ROWS` int(7) NOT NULL DEFAULT '0' `EXAMINED_ROWS` int(7) NOT NULL DEFAULT '0',
`QUERY_ID` bigint(4) NOT NULL DEFAULT '0'
) DEFAULT CHARSET=utf8 ) DEFAULT CHARSET=utf8
drop table t1; drop table t1;
create temporary table t1 like information_schema.processlist; create temporary table t1 like information_schema.processlist;
...@@ -1784,7 +1785,8 @@ t1 CREATE TEMPORARY TABLE `t1` ( ...@@ -1784,7 +1785,8 @@ t1 CREATE TEMPORARY TABLE `t1` (
`MAX_STAGE` tinyint(2) NOT NULL DEFAULT '0', `MAX_STAGE` tinyint(2) NOT NULL DEFAULT '0',
`PROGRESS` decimal(7,3) NOT NULL DEFAULT '0.000', `PROGRESS` decimal(7,3) NOT NULL DEFAULT '0.000',
`MEMORY_USED` int(7) NOT NULL DEFAULT '0', `MEMORY_USED` int(7) NOT NULL DEFAULT '0',
`EXAMINED_ROWS` int(7) NOT NULL DEFAULT '0' `EXAMINED_ROWS` int(7) NOT NULL DEFAULT '0',
`QUERY_ID` bigint(4) NOT NULL DEFAULT '0'
) DEFAULT CHARSET=utf8 ) DEFAULT CHARSET=utf8
drop table t1; drop table t1;
create table t1 like information_schema.character_sets; create table t1 like information_schema.character_sets;
......
...@@ -298,5 +298,13 @@ select 1; ...@@ -298,5 +298,13 @@ select 1;
Got one of the listed errors Got one of the listed errors
select 1; select 1;
Got one of the listed errors Got one of the listed errors
#
# MDEV-4911 - add KILL query id, and add query id information to
# processlist
#
SELECT SLEEP(1000);
KILL QUERY ID @id;
SLEEP(1000)
1
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL; DROP FUNCTION MY_KILL;
...@@ -175,7 +175,7 @@ t1 CREATE TABLE `t1` ( ...@@ -175,7 +175,7 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`ID`,`aaaa,aaaaa`,`ddddddddd`) PRIMARY KEY (`ID`,`aaaa,aaaaa`,`ddddddddd`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (ID) /*!50100 PARTITION BY RANGE (ID)
SUBPARTITION BY LINEAR KEY (ID,`aaaa,aaaaa`) SUBPARTITION BY LINEAR KEY (`ID`,`aaaa,aaaaa`)
SUBPARTITIONS 2 SUBPARTITIONS 2
(PARTITION p01 VALUES LESS THAN (100) ENGINE = MyISAM, (PARTITION p01 VALUES LESS THAN (100) ENGINE = MyISAM,
PARTITION p11 VALUES LESS THAN (200) ENGINE = MyISAM, PARTITION p11 VALUES LESS THAN (200) ENGINE = MyISAM,
......
...@@ -32,9 +32,9 @@ drop procedure bug4902_2| ...@@ -32,9 +32,9 @@ drop procedure bug4902_2|
drop procedure if exists bug6807| drop procedure if exists bug6807|
create procedure bug6807() create procedure bug6807()
begin begin
declare id int; declare a int;
set id = connection_id(); set a = connection_id();
kill query id; kill query a;
select 'Not reached'; select 'Not reached';
end| end|
call bug6807()| call bug6807()|
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
let $table= processlist; let $table= processlist;
# #
# columns of the information_schema table e.g. to use in a select. # columns of the information_schema table e.g. to use in a select.
let $columns= ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO, TIME_MS, STAGE, MAX_STAGE, PROGRESS, MEMORY_USED, EXAMINED_ROWS; let $columns= ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO, TIME_MS, STAGE, MAX_STAGE, PROGRESS, MEMORY_USED, EXAMINED_ROWS, QUERY_ID;
# #
# Where clause for an update. # Where clause for an update.
let $update_where= WHERE id=1 ; let $update_where= WHERE id=1 ;
...@@ -159,9 +159,9 @@ WHERE DB = 'information_schema' AND COMMAND = 'Sleep' AND USER = 'ddicttestuser1 ...@@ -159,9 +159,9 @@ WHERE DB = 'information_schema' AND COMMAND = 'Sleep' AND USER = 'ddicttestuser1
eval SHOW CREATE TABLE $table; eval SHOW CREATE TABLE $table;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
eval SHOW $table; eval SHOW $table;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
eval SELECT * FROM $table $select_where ORDER BY id; eval SELECT * FROM $table $select_where ORDER BY id;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
eval SELECT $columns FROM $table $select_where ORDER BY id; eval SELECT $columns FROM $table $select_where ORDER BY id;
--source suite/funcs_1/datadict/datadict_priv.inc --source suite/funcs_1/datadict/datadict_priv.inc
--real_sleep 0.3 --real_sleep 0.3
...@@ -179,9 +179,9 @@ connection con100; ...@@ -179,9 +179,9 @@ connection con100;
eval SHOW CREATE TABLE $table; eval SHOW CREATE TABLE $table;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
eval SHOW $table; eval SHOW $table;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
eval SELECT * FROM $table $select_where ORDER BY id; eval SELECT * FROM $table $select_where ORDER BY id;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
eval SELECT $columns FROM $table $select_where ORDER BY id; eval SELECT $columns FROM $table $select_where ORDER BY id;
--source suite/funcs_1/datadict/datadict_priv.inc --source suite/funcs_1/datadict/datadict_priv.inc
--real_sleep 0.3 --real_sleep 0.3
...@@ -205,7 +205,7 @@ connection con100; ...@@ -205,7 +205,7 @@ connection con100;
SHOW GRANTS; SHOW GRANTS;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -217,7 +217,7 @@ connect (con101,localhost,ddicttestuser1,ddictpass,information_schema); ...@@ -217,7 +217,7 @@ connect (con101,localhost,ddicttestuser1,ddictpass,information_schema);
SHOW GRANTS; SHOW GRANTS;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -239,7 +239,7 @@ connect (anonymous1,localhost,"''",,information_schema); ...@@ -239,7 +239,7 @@ connect (anonymous1,localhost,"''",,information_schema);
SHOW GRANTS; SHOW GRANTS;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -261,7 +261,7 @@ connect (con102,localhost,ddicttestuser1,ddictpass,information_schema); ...@@ -261,7 +261,7 @@ connect (con102,localhost,ddicttestuser1,ddictpass,information_schema);
SHOW GRANTS; SHOW GRANTS;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -287,7 +287,7 @@ if ($fixed_bug_30395) ...@@ -287,7 +287,7 @@ if ($fixed_bug_30395)
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
} }
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -308,7 +308,7 @@ connect (con103,localhost,ddicttestuser1,ddictpass,information_schema); ...@@ -308,7 +308,7 @@ connect (con103,localhost,ddicttestuser1,ddictpass,information_schema);
SHOW GRANTS FOR 'ddicttestuser1'@'localhost'; SHOW GRANTS FOR 'ddicttestuser1'@'localhost';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -330,7 +330,7 @@ connect (con104,localhost,ddicttestuser1,ddictpass,information_schema); ...@@ -330,7 +330,7 @@ connect (con104,localhost,ddicttestuser1,ddictpass,information_schema);
SHOW GRANTS FOR 'ddicttestuser1'@'localhost'; SHOW GRANTS FOR 'ddicttestuser1'@'localhost';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -377,7 +377,7 @@ connect (con200,localhost,ddicttestuser2,ddictpass,information_schema); ...@@ -377,7 +377,7 @@ connect (con200,localhost,ddicttestuser2,ddictpass,information_schema);
SHOW GRANTS FOR 'ddicttestuser2'@'localhost'; SHOW GRANTS FOR 'ddicttestuser2'@'localhost';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -398,7 +398,7 @@ connect (con201,localhost,ddicttestuser2,ddictpass,information_schema); ...@@ -398,7 +398,7 @@ connect (con201,localhost,ddicttestuser2,ddictpass,information_schema);
SHOW GRANTS; SHOW GRANTS;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -421,7 +421,7 @@ SHOW GRANTS FOR 'ddicttestuser1'@'localhost'; ...@@ -421,7 +421,7 @@ SHOW GRANTS FOR 'ddicttestuser1'@'localhost';
GRANT PROCESS ON *.* TO 'ddicttestuser2'@'localhost'; GRANT PROCESS ON *.* TO 'ddicttestuser2'@'localhost';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
...@@ -445,7 +445,7 @@ connect (con108,localhost,ddicttestuser1,ddictpass,information_schema); ...@@ -445,7 +445,7 @@ connect (con108,localhost,ddicttestuser1,ddictpass,information_schema);
SHOW GRANTS FOR 'ddicttestuser1'@'localhost'; SHOW GRANTS FOR 'ddicttestuser1'@'localhost';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW processlist; SHOW processlist;
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS --replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS 13 MEMORY 14 ROWS 15 QUERY_ID
SELECT * FROM information_schema.processlist; SELECT * FROM information_schema.processlist;
--real_sleep 0.3 --real_sleep 0.3
......
...@@ -93,7 +93,7 @@ echo ...@@ -93,7 +93,7 @@ echo
# - INFO must contain the corresponding SHOW/SELECT PROCESSLIST # - INFO must contain the corresponding SHOW/SELECT PROCESSLIST
# #
# 1. Just dump what we get # 1. Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
...@@ -166,7 +166,7 @@ let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST ...@@ -166,7 +166,7 @@ let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'test_user'; WHERE COMMAND = 'Sleep' AND USER = 'test_user';
--source include/wait_condition.inc --source include/wait_condition.inc
# 1. Just dump what we get # 1. Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
...@@ -211,7 +211,7 @@ echo ...@@ -211,7 +211,7 @@ echo
# ----- switch to connection con1 (user = test_user) ----- # ----- switch to connection con1 (user = test_user) -----
; ;
connection con1; connection con1;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
...@@ -245,7 +245,7 @@ echo ...@@ -245,7 +245,7 @@ echo
; ;
connection con2; connection con2;
# Just dump what we get # Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
...@@ -305,7 +305,7 @@ WHERE ID = @test_user_con2_id AND Command IN('Query','Execute') ...@@ -305,7 +305,7 @@ WHERE ID = @test_user_con2_id AND Command IN('Query','Execute')
AND State = 'User sleep' AND INFO IS NOT NULL ; AND State = 'User sleep' AND INFO IS NOT NULL ;
--source include/wait_condition.inc --source include/wait_condition.inc
# 1. Just dump what we get # 1. Just dump what we get
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
...@@ -376,7 +376,7 @@ let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST ...@@ -376,7 +376,7 @@ let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST
# #
# Expect to see the state 'Waiting for table metadata lock' for the third # Expect to see the state 'Waiting for table metadata lock' for the third
# connection because the SELECT collides with the WRITE TABLE LOCK. # connection because the SELECT collides with the WRITE TABLE LOCK.
--replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 6 <TIME> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
UNLOCK TABLES; UNLOCK TABLES;
# #
...@@ -435,7 +435,7 @@ echo ...@@ -435,7 +435,7 @@ echo
# SHOW FULL PROCESSLIST Complete statement # SHOW FULL PROCESSLIST Complete statement
# SHOW PROCESSLIST statement truncated after 100 char # SHOW PROCESSLIST statement truncated after 100 char
; ;
--replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> --replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE> 9 <TIME_MS> 13 <MEMORY> 14 <ROWS> 15 <QUERY_ID>
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
--replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE> --replace_column 1 <ID> 3 <HOST_NAME> 5 <COMMAND> 6 <TIME> 7 <STATE>
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
......
...@@ -241,6 +241,7 @@ def information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 429496729 ...@@ -241,6 +241,7 @@ def information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 429496729
def information_schema PROCESSLIST MAX_STAGE 11 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select def information_schema PROCESSLIST MAX_STAGE 11 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select
def information_schema PROCESSLIST MEMORY_USED 13 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select def information_schema PROCESSLIST MEMORY_USED 13 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select
def information_schema PROCESSLIST PROGRESS 12 0.000 NO decimal NULL NULL 7 3 NULL NULL NULL decimal(7,3) select def information_schema PROCESSLIST PROGRESS 12 0.000 NO decimal NULL NULL 7 3 NULL NULL NULL decimal(7,3) select
def information_schema PROCESSLIST QUERY_ID 15 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select
def information_schema PROCESSLIST STAGE 10 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select def information_schema PROCESSLIST STAGE 10 0 NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select
def information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select def information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select
def information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select def information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL NULL int(7) select
...@@ -729,6 +730,7 @@ NULL information_schema PROCESSLIST MAX_STAGE tinyint NULL NULL NULL NULL tinyin ...@@ -729,6 +730,7 @@ NULL information_schema PROCESSLIST MAX_STAGE tinyint NULL NULL NULL NULL tinyin
NULL information_schema PROCESSLIST PROGRESS decimal NULL NULL NULL NULL decimal(7,3) NULL information_schema PROCESSLIST PROGRESS decimal NULL NULL NULL NULL decimal(7,3)
NULL information_schema PROCESSLIST MEMORY_USED int NULL NULL NULL NULL int(7) NULL information_schema PROCESSLIST MEMORY_USED int NULL NULL NULL NULL int(7)
NULL information_schema PROCESSLIST EXAMINED_ROWS int NULL NULL NULL NULL int(7) NULL information_schema PROCESSLIST EXAMINED_ROWS int NULL NULL NULL NULL int(7)
NULL information_schema PROCESSLIST QUERY_ID bigint NULL NULL NULL NULL bigint(4)
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
......
...@@ -632,5 +632,17 @@ connection con4; ...@@ -632,5 +632,17 @@ connection con4;
select 1; select 1;
connection default; connection default;
--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;
reap;
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL; DROP FUNCTION MY_KILL;
...@@ -63,10 +63,10 @@ drop procedure if exists bug6807| ...@@ -63,10 +63,10 @@ drop procedure if exists bug6807|
--enable_warnings --enable_warnings
create procedure bug6807() create procedure bug6807()
begin begin
declare id int; declare a int;
set id = connection_id(); set a = connection_id();
kill query id; kill query a;
select 'Not reached'; select 'Not reached';
end| end|
......
...@@ -262,6 +262,7 @@ static SYMBOL symbols[] = { ...@@ -262,6 +262,7 @@ static SYMBOL symbols[] = {
{ "HOUR_MICROSECOND", SYM(HOUR_MICROSECOND_SYM)}, { "HOUR_MICROSECOND", SYM(HOUR_MICROSECOND_SYM)},
{ "HOUR_MINUTE", SYM(HOUR_MINUTE_SYM)}, { "HOUR_MINUTE", SYM(HOUR_MINUTE_SYM)},
{ "HOUR_SECOND", SYM(HOUR_SECOND_SYM)}, { "HOUR_SECOND", SYM(HOUR_SECOND_SYM)},
{ "ID", SYM(ID_SYM)},
{ "IDENTIFIED", SYM(IDENTIFIED_SYM)}, { "IDENTIFIED", SYM(IDENTIFIED_SYM)},
{ "IF", SYM(IF)}, { "IF", SYM(IF)},
{ "IGNORE", SYM(IGNORE_SYM)}, { "IGNORE", SYM(IGNORE_SYM)},
......
...@@ -437,7 +437,8 @@ extern int killed_errno(killed_state killed); ...@@ -437,7 +437,8 @@ extern int killed_errno(killed_state killed);
enum killed_type enum killed_type
{ {
KILL_TYPE_ID, KILL_TYPE_ID,
KILL_TYPE_USER KILL_TYPE_USER,
KILL_TYPE_QUERY
}; };
#include "sql_lex.h" /* Must be here */ #include "sql_lex.h" /* Must be here */
......
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
"FUNCTION" : "PROCEDURE") "FUNCTION" : "PROCEDURE")
static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables); static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables);
static void sql_kill(THD *thd, ulong id, killed_state state); static void sql_kill(THD *thd, longlong id, killed_state state, killed_type type);
static void sql_kill_user(THD *thd, LEX_USER *user, killed_state state); static void sql_kill_user(THD *thd, LEX_USER *user, killed_state state);
static bool execute_show_status(THD *, TABLE_LIST *); static bool execute_show_status(THD *, TABLE_LIST *);
static bool execute_rename_table(THD *, TABLE_LIST *, TABLE_LIST *); static bool execute_rename_table(THD *, TABLE_LIST *, TABLE_LIST *);
...@@ -1429,7 +1429,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1429,7 +1429,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
{ {
status_var_increment(thd->status_var.com_stat[SQLCOM_KILL]); status_var_increment(thd->status_var.com_stat[SQLCOM_KILL]);
ulong id=(ulong) uint4korr(packet); ulong id=(ulong) uint4korr(packet);
sql_kill(thd,id, KILL_CONNECTION_HARD); sql_kill(thd, id, KILL_CONNECTION_HARD, KILL_TYPE_ID);
break; break;
} }
case COM_SET_OPTION: case COM_SET_OPTION:
...@@ -3914,7 +3914,7 @@ case SQLCOM_PREPARE: ...@@ -3914,7 +3914,7 @@ case SQLCOM_PREPARE:
break; break;
} }
if (lex->kill_type == KILL_TYPE_ID) if (lex->kill_type == KILL_TYPE_ID || lex->kill_type == KILL_TYPE_QUERY)
{ {
Item *it= (Item *)lex->value_list.head(); Item *it= (Item *)lex->value_list.head();
if ((!it->fixed && it->fix_fields(lex->thd, &it)) || it->check_cols(1)) if ((!it->fixed && it->fix_fields(lex->thd, &it)) || it->check_cols(1))
...@@ -3923,7 +3923,7 @@ case SQLCOM_PREPARE: ...@@ -3923,7 +3923,7 @@ case SQLCOM_PREPARE:
MYF(0)); MYF(0));
goto error; goto error;
} }
sql_kill(thd, (ulong) it->val_int(), lex->kill_signal); sql_kill(thd, it->val_int(), lex->kill_signal, lex->kill_type);
} }
else else
sql_kill_user(thd, get_current_user(thd, lex->users_list.head()), sql_kill_user(thd, get_current_user(thd, lex->users_list.head()),
...@@ -6812,12 +6812,13 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List<String> *using_fields, ...@@ -6812,12 +6812,13 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List<String> *using_fields,
Find a thread by id and return it, locking it LOCK_thd_data Find a thread by id and return it, locking it LOCK_thd_data
@param id Identifier of the thread we're looking for @param id Identifier of the thread we're looking for
@param query_id If true, search by query_id instead of thread_id
@return NULL - not found @return NULL - not found
pointer - thread found, and its LOCK_thd_data is locked. pointer - thread found, and its LOCK_thd_data is locked.
*/ */
THD *find_thread_by_id(ulong id) THD *find_thread_by_id(longlong id, bool query_id)
{ {
THD *tmp; THD *tmp;
mysql_mutex_lock(&LOCK_thread_count); // For unlink from list mysql_mutex_lock(&LOCK_thread_count); // For unlink from list
...@@ -6826,7 +6827,7 @@ THD *find_thread_by_id(ulong id) ...@@ -6826,7 +6827,7 @@ THD *find_thread_by_id(ulong id)
{ {
if (tmp->command == COM_DAEMON) if (tmp->command == COM_DAEMON)
continue; continue;
if (tmp->thread_id == id) if (id == (query_id ? tmp->query_id : (longlong) tmp->thread_id))
{ {
mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from delete mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from delete
break; break;
...@@ -6838,24 +6839,26 @@ THD *find_thread_by_id(ulong id) ...@@ -6838,24 +6839,26 @@ THD *find_thread_by_id(ulong id)
/** /**
kill on thread. kill one thread.
@param thd Thread class @param thd Thread class
@param id Thread id @param id Thread id or query id
@param only_kill_query Should it kill the query or the connection @param kill_signal Should it kill the query or the connection
@param type Type of id: thread id or query id
@note @note
This is written such that we have a short lock on LOCK_thread_count This is written such that we have a short lock on LOCK_thread_count
*/ */
uint kill_one_thread(THD *thd, ulong id, killed_state kill_signal) uint
kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type type)
{ {
THD *tmp; THD *tmp;
uint error=ER_NO_SUCH_THREAD; uint error=ER_NO_SUCH_THREAD;
DBUG_ENTER("kill_one_thread"); DBUG_ENTER("kill_one_thread");
DBUG_PRINT("enter", ("id: %lu signal: %u", id, (uint) kill_signal)); DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal));
if ((tmp= find_thread_by_id(id))) if ((tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY)))
{ {
/* /*
If we're SUPER, we can KILL anything, including system-threads. If we're SUPER, we can KILL anything, including system-threads.
...@@ -6973,21 +6976,20 @@ static uint kill_threads_for_user(THD *thd, LEX_USER *user, ...@@ -6973,21 +6976,20 @@ static uint kill_threads_for_user(THD *thd, LEX_USER *user,
} }
/* /**
kills a thread and sends response kills a thread and sends response.
SYNOPSIS @param thd Thread class
sql_kill() @param id Thread id or query id
thd Thread class @param state Should it kill the query or the connection
id Thread id @param type Type of id: thread id or query id
only_kill_query Should it kill the query or the connection
*/ */
static static
void sql_kill(THD *thd, ulong id, killed_state state) void sql_kill(THD *thd, longlong id, killed_state state, killed_type type)
{ {
uint error; uint error;
if (!(error= kill_one_thread(thd, id, state))) if (!(error= kill_one_thread(thd, id, state, type)))
{ {
if ((!thd->killed)) if ((!thd->killed))
my_ok(thd); my_ok(thd);
......
...@@ -2613,6 +2613,9 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond) ...@@ -2613,6 +2613,9 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond)
table->field[13]->store((longlong) tmp->examined_row_count, TRUE); table->field[13]->store((longlong) tmp->examined_row_count, TRUE);
table->field[13]->set_notnull(); table->field[13]->set_notnull();
/* QUERY_ID */
table->field[14]->store(tmp->query_id, TRUE);
if (schema_table_store_record(thd, table)) if (schema_table_store_record(thd, table))
{ {
mysql_mutex_unlock(&LOCK_thread_count); mysql_mutex_unlock(&LOCK_thread_count);
...@@ -8656,6 +8659,7 @@ ST_FIELD_INFO processlist_fields_info[]= ...@@ -8656,6 +8659,7 @@ ST_FIELD_INFO processlist_fields_info[]=
SKIP_OPEN_TABLE}, SKIP_OPEN_TABLE},
{"MEMORY_USED", 7, MYSQL_TYPE_LONG, 0, 0, "Memory_used", SKIP_OPEN_TABLE}, {"MEMORY_USED", 7, MYSQL_TYPE_LONG, 0, 0, "Memory_used", SKIP_OPEN_TABLE},
{"EXAMINED_ROWS", 7, MYSQL_TYPE_LONG, 0, 0, "Examined_rows", SKIP_OPEN_TABLE}, {"EXAMINED_ROWS", 7, MYSQL_TYPE_LONG, 0, 0, "Examined_rows", SKIP_OPEN_TABLE},
{"QUERY_ID", 4, MYSQL_TYPE_LONGLONG, 0, 0, 0, SKIP_OPEN_TABLE},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
}; };
......
...@@ -121,7 +121,7 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table); ...@@ -121,7 +121,7 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table);
/* These functions were under INNODB_COMPATIBILITY_HOOKS */ /* These functions were under INNODB_COMPATIBILITY_HOOKS */
int get_quote_char_for_identifier(THD *thd, const char *name, uint length); int get_quote_char_for_identifier(THD *thd, const char *name, uint length);
THD *find_thread_by_id(ulong id); THD *find_thread_by_id(longlong id, bool query_id= false);
class select_result_explain_buffer; class select_result_explain_buffer;
/* /*
......
...@@ -790,10 +790,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -790,10 +790,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%pure_parser /* We have threads */ %pure_parser /* We have threads */
/* /*
Currently there are 196 shift/reduce conflicts. Currently there are 197 shift/reduce conflicts.
We should not introduce new conflicts any more. We should not introduce new conflicts any more.
*/ */
%expect 196 %expect 197
/* /*
Comments for TOKENS. Comments for TOKENS.
...@@ -1032,6 +1032,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1032,6 +1032,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token HOUR_MINUTE_SYM %token HOUR_MINUTE_SYM
%token HOUR_SECOND_SYM %token HOUR_SECOND_SYM
%token HOUR_SYM /* SQL-2003-R */ %token HOUR_SYM /* SQL-2003-R */
%token ID_SYM /* MYSQL */
%token IDENT %token IDENT
%token IDENTIFIED_SYM %token IDENTIFIED_SYM
%token IDENT_QUOTED %token IDENT_QUOTED
...@@ -12250,6 +12251,7 @@ kill: ...@@ -12250,6 +12251,7 @@ kill:
lex->value_list.empty(); lex->value_list.empty();
lex->users_list.empty(); lex->users_list.empty();
lex->sql_command= SQLCOM_KILL; lex->sql_command= SQLCOM_KILL;
lex->kill_type= KILL_TYPE_ID;
} }
kill_type kill_option kill_expr kill_type kill_option kill_expr
{ {
...@@ -12266,13 +12268,17 @@ kill_option: ...@@ -12266,13 +12268,17 @@ kill_option:
/* empty */ { $$= (int) KILL_CONNECTION; } /* empty */ { $$= (int) KILL_CONNECTION; }
| CONNECTION_SYM { $$= (int) KILL_CONNECTION; } | CONNECTION_SYM { $$= (int) KILL_CONNECTION; }
| QUERY_SYM { $$= (int) KILL_QUERY; } | QUERY_SYM { $$= (int) KILL_QUERY; }
| QUERY_SYM ID_SYM
{
$$= (int) KILL_QUERY;
Lex->kill_type= KILL_TYPE_QUERY;
}
; ;
kill_expr: kill_expr:
expr expr
{ {
Lex->value_list.push_front($$); Lex->value_list.push_front($$);
Lex->kill_type= KILL_TYPE_ID;
} }
| USER user | USER user
{ {
...@@ -13435,6 +13441,7 @@ keyword_sp: ...@@ -13435,6 +13441,7 @@ keyword_sp:
| HARD_SYM {} | HARD_SYM {}
| HOSTS_SYM {} | HOSTS_SYM {}
| HOUR_SYM {} | HOUR_SYM {}
| ID_SYM {}
| IDENTIFIED_SYM {} | IDENTIFIED_SYM {}
| IGNORE_SERVER_IDS_SYM {} | IGNORE_SERVER_IDS_SYM {}
| INDEX_STATS_SYM {} | INDEX_STATS_SYM {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment