mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Manually merge BUG#37145 to 5.1-bugteam
This commit is contained in:
commit
85cff45ef7
15 changed files with 682 additions and 25 deletions
21
mysql-test/include/diff_master_slave.inc
Normal file
21
mysql-test/include/diff_master_slave.inc
Normal file
|
@ -0,0 +1,21 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Diff the output of a statement on master and slave
|
||||
#
|
||||
# ==== Usage =====
|
||||
#
|
||||
# let $diff_statement= SELECT * FROM t1 WHERE a < 100;
|
||||
# source include/diff_master_slave.inc;
|
||||
|
||||
--echo source include/diff_master_slave.inc;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
|
||||
exec $MYSQL test -e "$diff_statement" > $MYSQLTEST_VARDIR/tmp/diff_master.out;
|
||||
sync_slave_with_master;
|
||||
exec $MYSQL_SLAVE test -e "$diff_statement" > $MYSQLTEST_VARDIR/tmp/diff_slave.out;
|
||||
|
||||
diff_files $MYSQLTEST_VARDIR/tmp/diff_master.out $MYSQLTEST_VARDIR/tmp/diff_slave.out;
|
||||
|
||||
enable_result_log;
|
||||
enable_query_log;
|
68
mysql-test/include/kill_query.inc
Normal file
68
mysql-test/include/kill_query.inc
Normal file
|
@ -0,0 +1,68 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Kill a query in the master connection, and then try to reap the
|
||||
# result of the killed query.
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# The following variables should be set before sourcing this file.
|
||||
#
|
||||
# $debug_lock: name of the debug user lock, if set, will release/lock
|
||||
# the specified debug lock accordingly, and before
|
||||
# sourcing this, connection 'master' should get the user
|
||||
# lock and run a query in another thread, which will
|
||||
# block before creating statement event.
|
||||
#
|
||||
# $connection_name: name of the connection that is waiting for the
|
||||
# lock, this can not be 'master'
|
||||
#
|
||||
# $connection_id: id of the connection that is waiting for the lock
|
||||
#
|
||||
# Example:
|
||||
# let $debug_lock=;
|
||||
# connection master1;
|
||||
# let $connection_name= master1;
|
||||
# let $connection_id= `SELECT CONNECTION_ID()`;
|
||||
# send CREATE TABLE t1;
|
||||
# source kill_query.inc;
|
||||
#
|
||||
# let $debug_lock= "debug_lock.before_query_log_event";
|
||||
# connection master;
|
||||
# eval SELECT GET_LOCK($debug_lock, 10);
|
||||
# connection master1;
|
||||
# let $connection_name= master1;
|
||||
# let $connection_id= `SELECT CONNECTION_ID()`;
|
||||
# send CREATE TABLE t1;
|
||||
# source kill_query.inc;
|
||||
|
||||
|
||||
--echo source include/kill_query.inc;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
connection master;
|
||||
|
||||
# kill the query that is waiting
|
||||
eval kill query $connection_id;
|
||||
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
# release the lock to allow binlog continue
|
||||
eval SELECT RELEASE_LOCK($debug_lock);
|
||||
}
|
||||
|
||||
# reap the result of the waiting query
|
||||
connection $connection_name;
|
||||
error 0, 1317, 1307, 1306, 1334, 1305;
|
||||
reap;
|
||||
|
||||
connection master;
|
||||
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
# get lock again to make the next query wait
|
||||
eval SELECT GET_LOCK($debug_lock, 10);
|
||||
}
|
||||
|
||||
connection $connection_name;
|
||||
enable_query_log;
|
||||
enable_result_log;
|
43
mysql-test/include/kill_query_and_diff_master_slave.inc
Normal file
43
mysql-test/include/kill_query_and_diff_master_slave.inc
Normal file
|
@ -0,0 +1,43 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Kill a query, sync master with slave, and diff the output of a
|
||||
# statement on master and slave to check if statement is correctly
|
||||
# replicated.
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# connection <CONNECTION>;
|
||||
# let $connection_name=<CONNECTION>
|
||||
# let $connection_id=`SELECT CONNECTION_ID()`;
|
||||
# let $diff_statement=<SQL COMMAND>;
|
||||
# send <SQL COMMAND>;
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
#
|
||||
# Note: <CONNECTION> must not be 'master'.
|
||||
#
|
||||
# See also kill_query.inc and diff_master_slave.inc for more
|
||||
# information
|
||||
|
||||
source include/kill_query.inc;
|
||||
|
||||
# Release the debug lock if used, so that the statements in
|
||||
# diff_master_slave.inc will not be blocked.
|
||||
connection master;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
eval SELECT RELEASE_LOCK($debug_lock);
|
||||
}
|
||||
enable_result_log;
|
||||
enable_query_log;
|
||||
|
||||
source include/diff_master_slave.inc;
|
||||
|
||||
# Acquire the debug lock again if used
|
||||
connection master;
|
||||
disable_query_log; disable_result_log; if (`SELECT '$debug_lock' !=
|
||||
''`) { eval SELECT GET_LOCK($debug_lock, 10); } enable_result_log;
|
||||
enable_query_log;
|
||||
|
||||
connection $connection_name;
|
|
@ -1600,14 +1600,22 @@ sub mysql_fix_arguments () {
|
|||
}
|
||||
|
||||
|
||||
sub client_arguments ($) {
|
||||
sub client_arguments ($;$) {
|
||||
my $client_name= shift;
|
||||
my $group_suffix= shift;
|
||||
my $client_exe= mtr_exe_exists("$path_client_bindir/$client_name");
|
||||
|
||||
my $args;
|
||||
mtr_init_args(\$args);
|
||||
mtr_add_arg($args, "--defaults-file=%s", $path_config_file);
|
||||
client_debug_arg($args, $client_name);
|
||||
if (defined($group_suffix)) {
|
||||
mtr_add_arg($args, "--defaults-group-suffix=%s", $group_suffix);
|
||||
client_debug_arg($args, "$client_name-$group_suffix");
|
||||
}
|
||||
else
|
||||
{
|
||||
client_debug_arg($args, $client_name);
|
||||
}
|
||||
return mtr_args2str($client_exe, @$args);
|
||||
}
|
||||
|
||||
|
@ -1858,6 +1866,7 @@ sub environment_setup {
|
|||
$ENV{'MYSQL_SHOW'}= client_arguments("mysqlshow");
|
||||
$ENV{'MYSQL_BINLOG'}= client_arguments("mysqlbinlog");
|
||||
$ENV{'MYSQL'}= client_arguments("mysql");
|
||||
$ENV{'MYSQL_SLAVE'}= client_arguments("mysql", ".2");
|
||||
$ENV{'MYSQL_UPGRADE'}= client_arguments("mysql_upgrade");
|
||||
$ENV{'MYSQLADMIN'}= native_path($exe_mysqladmin);
|
||||
$ENV{'MYSQL_CLIENT_TEST'}= mysql_client_test_arguments();
|
||||
|
|
169
mysql-test/suite/rpl/r/rpl_killed_ddl.result
Normal file
169
mysql-test/suite/rpl/r/rpl_killed_ddl.result
Normal file
|
@ -0,0 +1,169 @@
|
|||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
DROP DATABASE IF EXISTS d1;
|
||||
DROP DATABASE IF EXISTS d2;
|
||||
DROP DATABASE IF EXISTS d3;
|
||||
DROP DATABASE IF EXISTS d4;
|
||||
DROP EVENT IF EXISTS e1;
|
||||
DROP EVENT IF EXISTS e2;
|
||||
DROP EVENT IF EXISTS e3;
|
||||
DROP EVENT IF EXISTS e4;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
DROP FUNCTION IF EXISTS f2;
|
||||
DROP FUNCTION IF EXISTS f3;
|
||||
DROP FUNCTION IF EXISTS f4;
|
||||
DROP SERVER IF EXISTS s1;
|
||||
DROP SERVER IF EXISTS s2;
|
||||
DROP SERVER IF EXISTS s3;
|
||||
DROP SERVER IF EXISTS s4;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
DROP TABLE IF EXISTS t3;
|
||||
DROP TABLE IF EXISTS t4;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
DROP PROCEDURE IF EXISTS p4;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP TRIGGER IF EXISTS tr2;
|
||||
DROP TRIGGER IF EXISTS tr3;
|
||||
DROP TRIGGER IF EXISTS tr4;
|
||||
CREATE DATABASE d1;
|
||||
CREATE EVENT e1
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
DO INSERT INTO test.t1 VALUES (1);
|
||||
CREATE FUNCTION f1 () RETURNS INT DETERMINISTIC
|
||||
RETURN 1;
|
||||
CREATE PROCEDURE p1 (OUT rows INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO rows FROM t1;
|
||||
END;
|
||||
//
|
||||
CREATE SERVER s1
|
||||
FOREIGN DATA WRAPPER mysql
|
||||
OPTIONS (USER 'user1', HOST '192.168.1.106', DATABASE 'test');
|
||||
CREATE TABLE t1 (a int);
|
||||
CREATE TABLE t3 (a int);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW BEGIN
|
||||
DELETE FROM t4 WHERE a=NEW.a;
|
||||
END;
|
||||
//
|
||||
CREATE INDEX i1 ON t1 (a);
|
||||
CREATE VIEW v1 AS SELECT a FROM t1 WHERE a < 100;
|
||||
[on master]
|
||||
[on master1]
|
||||
CREATE DATABASE d2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP DATABASE d1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP DATABASE d2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE EVENT e2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
DO INSERT INTO test.t1 VALUES (2);
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP EVENT e1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP EVENT IF EXISTS e2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE FUNCTION f2 () RETURNS INT DETERMINISTIC
|
||||
RETURN 1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
ALTER FUNCTION f1 SQL SECURITY INVOKER;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP FUNCTION f1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE PROCEDURE p2 (OUT rows INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO rows FROM t2;
|
||||
END;
|
||||
//
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1';
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP PROCEDURE p1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE TABLE t2 (b int);
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
ALTER TABLE t1 ADD (d int);
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
RENAME TABLE t3 TO t4;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE INDEX i2 on t1 (a);
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP INDEX i1 on t1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE TRIGGER tr2 BEFORE INSERT ON t4
|
||||
FOR EACH ROW BEGIN
|
||||
DELETE FROM t1 WHERE a=NEW.a;
|
||||
END;
|
||||
//
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP TRIGGER tr1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP TRIGGER IF EXISTS tr2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
CREATE VIEW v2 AS SELECT a FROM t1 WHERE a > 100;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP VIEW v1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP VIEW IF EXISTS v2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP TABLE t1;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
source include/kill_query.inc;
|
||||
source include/diff_master_slave.inc;
|
||||
DROP DATABASE IF EXISTS d1;
|
||||
DROP DATABASE IF EXISTS d2;
|
||||
DROP DATABASE IF EXISTS d3;
|
||||
DROP DATABASE IF EXISTS d4;
|
||||
DROP EVENT IF EXISTS e1;
|
||||
DROP EVENT IF EXISTS e2;
|
||||
DROP EVENT IF EXISTS e3;
|
||||
DROP EVENT IF EXISTS e4;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
DROP FUNCTION IF EXISTS f2;
|
||||
DROP FUNCTION IF EXISTS f3;
|
||||
DROP FUNCTION IF EXISTS f4;
|
||||
DROP SERVER IF EXISTS s1;
|
||||
DROP SERVER IF EXISTS s2;
|
||||
DROP SERVER IF EXISTS s3;
|
||||
DROP SERVER IF EXISTS s4;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
DROP TABLE IF EXISTS t3;
|
||||
DROP TABLE IF EXISTS t4;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
DROP PROCEDURE IF EXISTS p4;
|
1
mysql-test/suite/rpl/t/rpl_killed_ddl-master.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_killed_ddl-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--debug=d,debug_lock_before_query_log_event
|
352
mysql-test/suite/rpl/t/rpl_killed_ddl.test
Normal file
352
mysql-test/suite/rpl/t/rpl_killed_ddl.test
Normal file
|
@ -0,0 +1,352 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# This test check if DDL statements are correctly binlogged when the
|
||||
# thread is killed
|
||||
#
|
||||
# ==== Method ====
|
||||
#
|
||||
# Start a DDL query and kill it, check if the error code of the binlog
|
||||
# event is correct.
|
||||
#
|
||||
# DDL statements tested:
|
||||
# CREATE/ALTER/RENAME/DROP DATABASE
|
||||
# CREATE/ALTER/DROP EVENT
|
||||
# CREATE/ALTER/DROP FUNCTION
|
||||
# CREATE/ALTER/DROP PROCEDURE
|
||||
# CREATE/ALTER/DROP SERVER
|
||||
# CREATE/ALTER/RENAME/DROP TABLE
|
||||
# CREATE/DROP TRIGGER
|
||||
# CREATE/ALTER/DROP VIEW
|
||||
#
|
||||
# ==== Bugs =====
|
||||
#
|
||||
# BUG#37145
|
||||
#
|
||||
# ==== TODO ====
|
||||
#
|
||||
# There are some part of the test are temporarily disabled because of
|
||||
# the following bugs, please enable then once they get fixed:
|
||||
# - BUG#44041
|
||||
# - BUG#43353
|
||||
# - BUG#25705
|
||||
# - BUG#44171
|
||||
|
||||
source include/have_debug.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
# Use the DBUG_SYNC_POINT to make sure the thread running the DDL is
|
||||
# waiting before creating the query log event
|
||||
|
||||
let $debug_lock= "debug_lock.before_query_log_event";
|
||||
|
||||
######## INITIALIZATION ########
|
||||
|
||||
disable_warnings;
|
||||
DROP DATABASE IF EXISTS d1;
|
||||
DROP DATABASE IF EXISTS d2;
|
||||
DROP DATABASE IF EXISTS d3;
|
||||
DROP DATABASE IF EXISTS d4;
|
||||
DROP EVENT IF EXISTS e1;
|
||||
DROP EVENT IF EXISTS e2;
|
||||
DROP EVENT IF EXISTS e3;
|
||||
DROP EVENT IF EXISTS e4;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
DROP FUNCTION IF EXISTS f2;
|
||||
DROP FUNCTION IF EXISTS f3;
|
||||
DROP FUNCTION IF EXISTS f4;
|
||||
DROP SERVER IF EXISTS s1;
|
||||
DROP SERVER IF EXISTS s2;
|
||||
DROP SERVER IF EXISTS s3;
|
||||
DROP SERVER IF EXISTS s4;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
DROP TABLE IF EXISTS t3;
|
||||
DROP TABLE IF EXISTS t4;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
DROP PROCEDURE IF EXISTS p4;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP TRIGGER IF EXISTS tr2;
|
||||
DROP TRIGGER IF EXISTS tr3;
|
||||
DROP TRIGGER IF EXISTS tr4;
|
||||
enable_warnings;
|
||||
|
||||
CREATE DATABASE d1;
|
||||
|
||||
CREATE EVENT e1
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
DO INSERT INTO test.t1 VALUES (1);
|
||||
|
||||
CREATE FUNCTION f1 () RETURNS INT DETERMINISTIC
|
||||
RETURN 1;
|
||||
|
||||
DELIMITER //;
|
||||
CREATE PROCEDURE p1 (OUT rows INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO rows FROM t1;
|
||||
END;
|
||||
//
|
||||
DELIMITER ;//
|
||||
|
||||
CREATE SERVER s1
|
||||
FOREIGN DATA WRAPPER mysql
|
||||
OPTIONS (USER 'user1', HOST '192.168.1.106', DATABASE 'test');
|
||||
|
||||
CREATE TABLE t1 (a int);
|
||||
CREATE TABLE t3 (a int);
|
||||
|
||||
DELIMITER //;
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1
|
||||
FOR EACH ROW BEGIN
|
||||
DELETE FROM t4 WHERE a=NEW.a;
|
||||
END;
|
||||
//
|
||||
DELIMITER ;//
|
||||
|
||||
CREATE INDEX i1 ON t1 (a);
|
||||
|
||||
CREATE VIEW v1 AS SELECT a FROM t1 WHERE a < 100;
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
connection master1;
|
||||
let $connection_name= master1;
|
||||
let $connection_id= `SELECT CONNECTION_ID()`;
|
||||
|
||||
connection master;
|
||||
echo [on master];
|
||||
|
||||
# This will block the execution of a statement at the DBUG_SYNC_POINT
|
||||
# with given lock name
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
eval SELECT IS_FREE_LOCK($debug_lock);
|
||||
eval SELECT GET_LOCK($debug_lock, 10);
|
||||
eval SELECT IS_FREE_LOCK($debug_lock);
|
||||
enable_query_log;
|
||||
enable_result_log;
|
||||
}
|
||||
|
||||
######## START TEST ########
|
||||
|
||||
connection master1;
|
||||
echo [on master1];
|
||||
|
||||
disable_warnings;
|
||||
|
||||
######## DATABASE ########
|
||||
|
||||
let $diff_statement= SHOW DATABASES LIKE 'd%';
|
||||
|
||||
send CREATE DATABASE d2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# Temporarily disabled, see BUG#44041, the ALTER DATABASE can affect the
|
||||
# collation of other database on slave
|
||||
#send ALTER DATABASE d1
|
||||
# DEFAULT CHARACTER SET = 'utf8';
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP DATABASE d1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP DATABASE d2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## EVENT ########
|
||||
|
||||
let $diff_statement= SELECT event_name, event_body, execute_at
|
||||
FROM information_schema.events where event_name like 'e%';
|
||||
|
||||
send CREATE EVENT e2
|
||||
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
|
||||
DO INSERT INTO test.t1 VALUES (2);
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# Temporarily disabled because of BUG#44171, killing ALTER EVENT can
|
||||
# crash the server
|
||||
#send ALTER EVENT e1
|
||||
# ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 DAY;
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP EVENT e1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP EVENT IF EXISTS e2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## FUNCTION ########
|
||||
|
||||
let $diff_statement= SHOW FUNCTION STATUS LIKE 'f%';
|
||||
|
||||
send CREATE FUNCTION f2 () RETURNS INT DETERMINISTIC
|
||||
RETURN 1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send ALTER FUNCTION f1 SQL SECURITY INVOKER;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# function f1 probably does not exist because the ALTER query was
|
||||
# killed
|
||||
send DROP FUNCTION f1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# function f2 probably does not exist because the CREATE query was
|
||||
# killed
|
||||
#
|
||||
# Temporarily disabled. Because of BUG#43353, KILL the query may
|
||||
# result in function not found, and for 5.1, DROP statements will be
|
||||
# logged if the function is not found on master, so the following DROP
|
||||
# FUNCTION statement may be interrupted and not drop the function on
|
||||
# master, but still get logged and executed on slave and cause
|
||||
# inconsistence. Also disable the following DROP PROCEDURE IF EXITS
|
||||
# below.
|
||||
#send DROP FUNCTION IF EXISTS f2;
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## PROCEDURE ########
|
||||
|
||||
let $diff_statement= SHOW PROCEDURE STATUS LIKE 'p%';
|
||||
|
||||
DELIMITER //;
|
||||
send CREATE PROCEDURE p2 (OUT rows INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO rows FROM t2;
|
||||
END;
|
||||
//
|
||||
DELIMITER ;//
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1';
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP PROCEDURE p1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# Temporarily disabled, see comment above for DROP FUNCTION IF EXISTS
|
||||
#send DROP PROCEDURE IF EXISTS p2;
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## TABLE ########
|
||||
|
||||
let $diff_statement= SHOW TABLES LIKE 't%';
|
||||
|
||||
send CREATE TABLE t2 (b int);
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send ALTER TABLE t1 ADD (d int);
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send RENAME TABLE t3 TO t4;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## INDEX ########
|
||||
|
||||
let $diff_statement= SHOW INDEX FROM t1;
|
||||
|
||||
send CREATE INDEX i2 on t1 (a);
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP INDEX i1 on t1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
|
||||
######## SERVER ########
|
||||
|
||||
# Tempoarily disabled, see bug#25705
|
||||
|
||||
# let $diff_statement= SELECT * FROM mysql.server WHERE name like 's%';
|
||||
|
||||
# send CREATE SERVER s2
|
||||
# FOREIGN DATA WRAPPER mysql
|
||||
# OPTIONS (USER 'user2', HOST '192.168.1.108', DATABASE 'test');
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# send ALTER SERVER s1
|
||||
# OPTIONS (DATABASE 'test1');
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# send DROP SERVER s1;
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# send DROP SERVER IF EXIST s1;
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## TRIGGER ########
|
||||
|
||||
let $diff_statement= SHOW TRIGGERS LIKE 'v%';
|
||||
|
||||
DELIMITER //;
|
||||
send CREATE TRIGGER tr2 BEFORE INSERT ON t4
|
||||
FOR EACH ROW BEGIN
|
||||
DELETE FROM t1 WHERE a=NEW.a;
|
||||
END;
|
||||
//
|
||||
DELIMITER ;//
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP TRIGGER tr1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP TRIGGER IF EXISTS tr2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## VIEW ########
|
||||
|
||||
let $diff_statement= SHOW TABLES LIKE 'v%';
|
||||
|
||||
send CREATE VIEW v2 AS SELECT a FROM t1 WHERE a > 100;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP VIEW v1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP VIEW IF EXISTS v2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## DROP TABLE ########
|
||||
|
||||
let $diff_statement= SHOW TABLES LIKE 't%';
|
||||
|
||||
send DROP TABLE t1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP TABLE IF EXISTS t2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## CLEAN UP ########
|
||||
|
||||
connection master;
|
||||
|
||||
# The DROP statements above are killed during the process, so they
|
||||
# does not make sure the objects are dropped.
|
||||
|
||||
disable_warnings;
|
||||
DROP DATABASE IF EXISTS d1;
|
||||
DROP DATABASE IF EXISTS d2;
|
||||
DROP DATABASE IF EXISTS d3;
|
||||
DROP DATABASE IF EXISTS d4;
|
||||
DROP EVENT IF EXISTS e1;
|
||||
DROP EVENT IF EXISTS e2;
|
||||
DROP EVENT IF EXISTS e3;
|
||||
DROP EVENT IF EXISTS e4;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
DROP FUNCTION IF EXISTS f2;
|
||||
DROP FUNCTION IF EXISTS f3;
|
||||
DROP FUNCTION IF EXISTS f4;
|
||||
DROP SERVER IF EXISTS s1;
|
||||
DROP SERVER IF EXISTS s2;
|
||||
DROP SERVER IF EXISTS s3;
|
||||
DROP SERVER IF EXISTS s4;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
DROP TABLE IF EXISTS t3;
|
||||
DROP TABLE IF EXISTS t4;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
DROP PROCEDURE IF EXISTS p4;
|
||||
enable_warnings;
|
|
@ -940,7 +940,8 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
|
|||
thd->variables.sql_mode= saved_mode;
|
||||
/* Such a statement can always go directly to binlog, no trans cache */
|
||||
thd->binlog_query(THD::MYSQL_QUERY_TYPE,
|
||||
log_query.c_ptr(), log_query.length(), FALSE, FALSE);
|
||||
log_query.c_ptr(), log_query.length(),
|
||||
FALSE, FALSE, THD::NOT_KILLED);
|
||||
thd->variables.sql_mode= 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1647,7 +1647,8 @@ bool change_password(THD *thd, const char *host, const char *user,
|
|||
acl_user->host.hostname ? acl_user->host.hostname : "",
|
||||
new_password));
|
||||
thd->clear_error();
|
||||
thd->binlog_query(THD::MYSQL_QUERY_TYPE, buff, query_length, FALSE, FALSE);
|
||||
thd->binlog_query(THD::MYSQL_QUERY_TYPE, buff, query_length,
|
||||
FALSE, FALSE, THD::NOT_KILLED);
|
||||
}
|
||||
end:
|
||||
close_thread_tables(thd);
|
||||
|
|
|
@ -1541,19 +1541,8 @@ void close_temporary_tables(THD *thd)
|
|||
thd->variables.character_set_client= system_charset_info;
|
||||
Query_log_event qinfo(thd, s_query.ptr(),
|
||||
s_query.length() - 1 /* to remove trailing ',' */,
|
||||
0, FALSE);
|
||||
0, FALSE, THD::NOT_KILLED);
|
||||
thd->variables.character_set_client= cs_save;
|
||||
/*
|
||||
Imagine the thread had created a temp table, then was doing a
|
||||
SELECT, and the SELECT was killed. Then it's not clever to
|
||||
mark the statement above as "killed", because it's not really
|
||||
a statement updating data, and there are 99.99% chances it
|
||||
will succeed on slave. If a real update (one updating a
|
||||
persistent table) was killed on the master, then this real
|
||||
update will be logged with error_code=killed, rightfully
|
||||
causing the slave to stop.
|
||||
*/
|
||||
qinfo.error_code= 0;
|
||||
mysql_bin_log.write(&qinfo);
|
||||
thd->variables.pseudo_thread_id= save_pseudo_thread_id;
|
||||
}
|
||||
|
@ -4017,7 +4006,8 @@ retry:
|
|||
end = strxmov(strmov(query, "DELETE FROM `"),
|
||||
share->db.str,"`.`",share->table_name.str,"`", NullS);
|
||||
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||
query, (ulong)(end-query), FALSE, FALSE);
|
||||
query, (ulong)(end-query),
|
||||
FALSE, FALSE, THD::NOT_KILLED);
|
||||
my_free(query, MYF(0));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -181,7 +181,7 @@ uchar* dboptions_get_key(my_dbopt_t *opt, size_t *length,
|
|||
static inline void write_to_binlog(THD *thd, char *query, uint q_len,
|
||||
char *db, uint db_len)
|
||||
{
|
||||
Query_log_event qinfo(thd, query, q_len, 0, 0);
|
||||
Query_log_event qinfo(thd, query, q_len, 0, 0, THD::NOT_KILLED);
|
||||
qinfo.error_code= 0;
|
||||
qinfo.db= db;
|
||||
qinfo.db_len= db_len;
|
||||
|
@ -724,7 +724,7 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info,
|
|||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, query, query_length, 0,
|
||||
/* suppress_use */ TRUE);
|
||||
/* suppress_use */ TRUE, THD::NOT_KILLED);
|
||||
|
||||
/*
|
||||
Write should use the database being created as the "current
|
||||
|
@ -812,7 +812,7 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
|
|||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0,
|
||||
/* suppress_use */ TRUE);
|
||||
/* suppress_use */ TRUE, THD::NOT_KILLED);
|
||||
|
||||
/*
|
||||
Write should use the database being created as the "current
|
||||
|
@ -959,7 +959,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
|
|||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, query, query_length, 0,
|
||||
/* suppress_use */ TRUE);
|
||||
/* suppress_use */ TRUE, THD::NOT_KILLED);
|
||||
/*
|
||||
Write should use the database being created as the "current
|
||||
database" and not the threads current database, which is the
|
||||
|
@ -1958,7 +1958,8 @@ bool mysql_upgrade_db(THD *thd, LEX_STRING *old_db)
|
|||
/* Step8: logging */
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, TRUE);
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
0, TRUE, THD::NOT_KILLED);
|
||||
thd->clear_error();
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
|
|
|
@ -1463,7 +1463,7 @@ void write_bin_log(THD *thd, bool clear_error,
|
|||
if (clear_error)
|
||||
thd->clear_error();
|
||||
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||
query, query_length, FALSE, FALSE);
|
||||
query, query_length, FALSE, FALSE, THD::NOT_KILLED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6165,7 +6165,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
thd->clear_error();
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
0, FALSE, THD::NOT_KILLED);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
my_ok(thd);
|
||||
|
|
|
@ -662,7 +662,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
|||
buff.append(views->source.str, views->source.length);
|
||||
|
||||
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||
buff.ptr(), buff.length(), FALSE, FALSE);
|
||||
buff.ptr(), buff.length(), FALSE, FALSE, THD::NOT_KILLED);
|
||||
}
|
||||
|
||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||
|
|
Loading…
Reference in a new issue