mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge branch '10.5' into 10.6
This commit is contained in:
@@ -935,7 +935,7 @@ static int run_mysqlcheck_upgrade(my_bool mysql_db_only)
|
||||
return 0;
|
||||
}
|
||||
verbose("Phase %d/%d: Checking and upgrading %s", ++phase, phases_total, what);
|
||||
print_conn_args("mysqlcheck");
|
||||
print_conn_args("mariadb-check");
|
||||
retch= run_tool(mysqlcheck_path,
|
||||
NULL, /* Send output from mysqlcheck directly to screen */
|
||||
defaults_file,
|
||||
@@ -1451,7 +1451,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Find mysql */
|
||||
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name);
|
||||
find_tool(mysql_path, IF_WIN("mariadb.exe", "mariadb"), self_name);
|
||||
|
||||
open_mysql_upgrade_file();
|
||||
|
||||
@@ -1459,7 +1459,7 @@ int main(int argc, char **argv)
|
||||
exit(upgrade_already_done(0) == 0);
|
||||
|
||||
/* Find mysqlcheck */
|
||||
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name);
|
||||
find_tool(mysqlcheck_path, IF_WIN("mariadb-check.exe", "mariadb-check"), self_name);
|
||||
|
||||
if (opt_systables_only && !opt_silent)
|
||||
printf("The --upgrade-system-tables option was used, user tables won't be touched.\n");
|
||||
|
@@ -436,6 +436,7 @@ void safe_mutex_free_deadlock_data(safe_mutex_t *mp);
|
||||
#define my_cond_wait(A,B) safe_cond_wait((A), (B), __FILE__, __LINE__)
|
||||
#else
|
||||
|
||||
#define safe_mutex_is_owner(mp) (1)
|
||||
#define safe_mutex_assert_owner(mp) do {} while (0)
|
||||
#define safe_mutex_assert_not_owner(mp) do {} while (0)
|
||||
#define safe_mutex_setflags(mp, F) do {} while (0)
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
239
mysql-test/main/kill_debug.result
Normal file
239
mysql-test/main/kill_debug.result
Normal file
@@ -0,0 +1,239 @@
|
||||
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;
|
||||
#
|
||||
# MDEV-29368 Assertion `trx->mysql_thd == thd' failed in innobase_kill_query from process_timers/timer_handler and use-after-poison in innobase_kill_query
|
||||
#
|
||||
connect foo,localhost,root;
|
||||
create table t1 (a int) engine=innodb;
|
||||
insert t1 values (1);
|
||||
set debug_sync='THD_cleanup_after_set_killed SIGNAL go0 WAIT_FOR go1';
|
||||
set debug_sync='innobase_connection_closed SIGNAL go2 WAIT_FOR go3';
|
||||
disconnect foo;
|
||||
connection default;
|
||||
set debug_sync='now WAIT_FOR go0';
|
||||
set debug_sync='found_killee SIGNAL go1 WAIT_FOR go2';
|
||||
kill $id;
|
||||
set debug_sync='now SIGNAL go3';
|
||||
drop table t1;
|
||||
set debug_sync='reset';
|
318
mysql-test/main/kill_debug.test
Normal file
318
mysql-test/main/kill_debug.test
Normal file
@@ -0,0 +1,318 @@
|
||||
#
|
||||
# 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/have_innodb.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;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-29368 Assertion `trx->mysql_thd == thd' failed in innobase_kill_query from process_timers/timer_handler and use-after-poison in innobase_kill_query
|
||||
--echo #
|
||||
connect foo,localhost,root;
|
||||
let $id=`select connection_id()`;
|
||||
create table t1 (a int) engine=innodb;
|
||||
insert t1 values (1);
|
||||
set debug_sync='THD_cleanup_after_set_killed SIGNAL go0 WAIT_FOR go1';
|
||||
set debug_sync='innobase_connection_closed SIGNAL go2 WAIT_FOR go3';
|
||||
disconnect foo;
|
||||
|
||||
connection default;
|
||||
set debug_sync='now WAIT_FOR go0';
|
||||
set debug_sync='found_killee SIGNAL go1 WAIT_FOR go2';
|
||||
evalp kill $id;
|
||||
set debug_sync='now SIGNAL go3';
|
||||
drop table t1;
|
||||
set debug_sync='reset';
|
@@ -1900,18 +1900,18 @@ FLUSH PRIVILEGES;
|
||||
#
|
||||
This installation of MariaDB is already upgraded to MariaDB .
|
||||
There is no need to run mysql_upgrade again for MariaDB .
|
||||
Looking for 'mysql' as: mysql
|
||||
Looking for 'mariadb' as: mariadb
|
||||
This installation of MariaDB is already upgraded to MariaDB .
|
||||
There is no need to run mysql_upgrade again for MariaDB .
|
||||
#
|
||||
# MDEV-27279: mariadb_upgrade check-if-upgrade absence is do it
|
||||
#
|
||||
Looking for 'mysql' as: mysql
|
||||
Looking for 'mariadb' as: mariadb
|
||||
Empty or non existent ...mysql_upgrade_info. Assuming mysql_upgrade has to be run!
|
||||
#
|
||||
# MDEV-27279: mariadb_upgrade check-if-upgrade with minor version change
|
||||
#
|
||||
Looking for 'mysql' as: mysql
|
||||
Looking for 'mariadb' as: mariadb
|
||||
This installation of MariaDB is already upgraded to MariaDB .
|
||||
There is no need to run mysql_upgrade again for MariaDB .
|
||||
This installation of MariaDB is already upgraded to MariaDB .
|
||||
|
@@ -55,7 +55,7 @@ DROP USER mysqltest1@'%';
|
||||
|
||||
--echo Run mysql_upgrade with a non existing server socket
|
||||
--replace_result $MYSQLTEST_VARDIR var
|
||||
--replace_regex /.*mysqlcheck.*: Got/mysqlcheck: Got/ /\([0-9|-]*\)/(errno)/
|
||||
--replace_regex /.*mariadb-check.*: Got/mariadb-check: Got/ /\([0-9|-]*\)/(errno)/
|
||||
--error 1
|
||||
# NC: Added --skip-version-check, as the version check would fail when
|
||||
# mysql_upgrade tries to get the server version.
|
||||
@@ -139,7 +139,7 @@ let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
--echo Run mysql_upgrade with unauthorized access
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --skip-verbose --user=root --password=wrong_password 2>&1
|
||||
--replace_regex /.*mysqlcheck.*: Got/mysqlcheck: Got/ /\([0-9|-]*\)/(errno)/
|
||||
--replace_regex /.*mariadb-check.*: Got/mariadb-check: Got/ /\([0-9|-]*\)/(errno)/
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --skip-verbose --skip-version-check --user=root --password=wrong_password 2>&1
|
||||
|
||||
@@ -290,7 +290,7 @@ FLUSH PRIVILEGES;
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
|
||||
|
||||
@@ -302,7 +302,7 @@ FLUSH PRIVILEGES;
|
||||
--replace_regex /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
|
||||
|
||||
--replace_regex /'mysql.* as:[^\n]*/'mysql' as: mysql/ /open .* Assuming/open XXX. Assuming/ /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/
|
||||
--replace_regex /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/ /open .* Assuming/open XXX. Assuming/ /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
|
||||
|
||||
--echo #
|
||||
@@ -324,7 +324,7 @@ EOF
|
||||
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/
|
||||
--error 1
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
|
||||
@@ -351,7 +351,7 @@ EOF
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/
|
||||
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mysql' as: mysql/
|
||||
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
|
||||
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
|
||||
drop table mysql.global_priv;
|
||||
|
@@ -1475,7 +1475,7 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
|
||||
the required dynamic memory allocated.
|
||||
*/
|
||||
while (stringcmp(&debug_sync_global.ds_signal, &action->wait_for) &&
|
||||
!thd->killed && opt_debug_sync_timeout)
|
||||
!(thd->killed & KILL_HARD_BIT) && opt_debug_sync_timeout)
|
||||
{
|
||||
error= mysql_cond_timedwait(&debug_sync_global.ds_cond,
|
||||
&debug_sync_global.ds_mutex,
|
||||
|
@@ -909,15 +909,14 @@ void ha_close_connection(THD* thd)
|
||||
{
|
||||
for (auto i= 0; i < MAX_HA; i++)
|
||||
{
|
||||
if (thd->ha_data[i].lock)
|
||||
if (plugin_ref plugin= thd->ha_data[i].lock)
|
||||
{
|
||||
handlerton *hton= plugin_hton(thd->ha_data[i].lock);
|
||||
thd->ha_data[i].lock= NULL;
|
||||
handlerton *hton= plugin_hton(plugin);
|
||||
if (hton->close_connection)
|
||||
hton->close_connection(hton, thd);
|
||||
/* make sure SE didn't reset ha_data in close_connection() */
|
||||
DBUG_ASSERT(thd->ha_data[i].lock);
|
||||
/* make sure ha_data is reset and ha_data_lock is released */
|
||||
thd_set_ha_data(thd, hton, 0);
|
||||
plugin_unlock(NULL, plugin);
|
||||
}
|
||||
DBUG_ASSERT(!thd->ha_data[i].ha_ptr);
|
||||
}
|
||||
|
@@ -8512,7 +8512,11 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
|
||||
++num_commits;
|
||||
if (current->cache_mngr->using_xa && likely(!current->error) &&
|
||||
DBUG_EVALUATE_IF("skip_commit_ordered", 0, 1))
|
||||
{
|
||||
mysql_mutex_lock(¤t->thd->LOCK_thd_data);
|
||||
run_commit_ordered(current->thd, current->all);
|
||||
mysql_mutex_unlock(¤t->thd->LOCK_thd_data);
|
||||
}
|
||||
current->thd->wakeup_subsequent_commits(current->error);
|
||||
|
||||
/*
|
||||
|
@@ -451,6 +451,7 @@ void thd_storage_lock_wait(THD *thd, long long value)
|
||||
extern "C"
|
||||
void *thd_get_ha_data(const THD *thd, const struct handlerton *hton)
|
||||
{
|
||||
DBUG_ASSERT(thd == current_thd || mysql_mutex_is_owner(&thd->LOCK_thd_data));
|
||||
return thd->ha_data[hton->slot].ha_ptr;
|
||||
}
|
||||
|
||||
@@ -1538,6 +1539,8 @@ void THD::cleanup(void)
|
||||
wsrep_client_thread= false;
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
DEBUG_SYNC(this, "THD_cleanup_after_set_killed");
|
||||
|
||||
mysql_ha_cleanup(this);
|
||||
locked_tables_list.unlock_locked_tables(this);
|
||||
|
||||
|
@@ -9210,7 +9210,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
|
||||
tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY);
|
||||
if (!tmp)
|
||||
DBUG_RETURN(error);
|
||||
|
||||
DEBUG_SYNC(thd, "found_killee");
|
||||
if (tmp->get_command() != COM_DAEMON)
|
||||
{
|
||||
/*
|
||||
|
@@ -656,7 +656,7 @@ release_and_exit:
|
||||
mysql_mutex_unlock(&btr_defragment_mutex);
|
||||
func_exit:
|
||||
set_current_thd(nullptr);
|
||||
innobase_destroy_background_thd(thd);
|
||||
destroy_background_thd(thd);
|
||||
return;
|
||||
}
|
||||
item = *btr_defragment_wq.begin();
|
||||
|
@@ -381,7 +381,7 @@ static void dict_stats_func(void*)
|
||||
while (dict_stats_process_entry_from_recalc_pool(thd)) {}
|
||||
dict_defrag_process_entries_from_defrag_pool(thd);
|
||||
set_current_thd(nullptr);
|
||||
innobase_destroy_background_thd(thd);
|
||||
destroy_background_thd(thd);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -2974,7 +2974,7 @@ fts_optimize_shutdown()
|
||||
&fts_optimize_wq->mutex.m_mutex);
|
||||
}
|
||||
|
||||
innobase_destroy_background_thd(fts_opt_thd);
|
||||
destroy_background_thd(fts_opt_thd);
|
||||
fts_opt_thd = NULL;
|
||||
pthread_cond_destroy(&fts_opt_shutdown_cond);
|
||||
mysql_mutex_unlock(&fts_optimize_wq->mutex);
|
||||
|
@@ -125,7 +125,6 @@ void thd_clear_error(MYSQL_THD thd);
|
||||
TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len,
|
||||
const char *table, size_t table_len);
|
||||
MYSQL_THD create_background_thd();
|
||||
void destroy_background_thd(MYSQL_THD thd);
|
||||
void reset_thd(MYSQL_THD thd);
|
||||
TABLE *get_purge_table(THD *thd);
|
||||
TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
|
||||
@@ -1834,20 +1833,6 @@ THD *innodb_thd_increment_pending_ops(THD *thd)
|
||||
return thd;
|
||||
}
|
||||
|
||||
/** Destroy a background purge thread THD.
|
||||
@param[in] thd MYSQL_THD to destroy */
|
||||
void
|
||||
innobase_destroy_background_thd(
|
||||
/*============================*/
|
||||
MYSQL_THD thd)
|
||||
{
|
||||
/* need to close the connection explicitly, the server won't do it
|
||||
if innodb is in the PLUGIN_IS_DYING state */
|
||||
innobase_close_connection(innodb_hton_ptr, thd);
|
||||
thd_set_ha_data(thd, innodb_hton_ptr, NULL);
|
||||
destroy_background_thd(thd);
|
||||
}
|
||||
|
||||
/** Close opened tables, free memory, delete items for a MYSQL_THD.
|
||||
@param[in] thd MYSQL_THD to reset */
|
||||
void
|
||||
@@ -5032,6 +5017,7 @@ static int innobase_close_connection(handlerton *hton, THD *thd)
|
||||
DBUG_ASSERT(hton == innodb_hton_ptr);
|
||||
if (auto trx= thd_to_trx(thd))
|
||||
{
|
||||
thd_set_ha_data(thd, innodb_hton_ptr, NULL);
|
||||
if (trx->state == TRX_STATE_PREPARED && trx->has_logged_persistent())
|
||||
{
|
||||
trx_disconnect_prepared(trx);
|
||||
@@ -5039,6 +5025,7 @@ static int innobase_close_connection(handlerton *hton, THD *thd)
|
||||
}
|
||||
innobase_rollback_trx(trx);
|
||||
trx->free();
|
||||
DEBUG_SYNC(thd, "innobase_connection_closed");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, 2021, MariaDB Corporation.
|
||||
Copyright (c) 2017, 2022, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@@ -460,10 +460,9 @@ normalize_table_name_c_low(
|
||||
@return new MYSQL_THD */
|
||||
MYSQL_THD innobase_create_background_thd(const char* name);
|
||||
|
||||
/** Destroy a background purge thread THD.
|
||||
/** Destroy a THD object associated with a background task.
|
||||
@param[in] thd MYSQL_THD to destroy */
|
||||
void
|
||||
innobase_destroy_background_thd(MYSQL_THD);
|
||||
void destroy_background_thd(MYSQL_THD thd);
|
||||
|
||||
/** Close opened tables, free memory, delete items for a MYSQL_THD.
|
||||
@param[in] thd MYSQL_THD to reset */
|
||||
|
@@ -1925,7 +1925,7 @@ static void srv_shutdown_purge_tasks()
|
||||
std::unique_lock<std::mutex> lk(purge_thd_mutex);
|
||||
while (!purge_thds.empty())
|
||||
{
|
||||
innobase_destroy_background_thd(purge_thds.front());
|
||||
destroy_background_thd(purge_thds.front());
|
||||
purge_thds.pop_front();
|
||||
}
|
||||
n_purge_thds= 0;
|
||||
|
Reference in New Issue
Block a user