mirror of
https://github.com/MariaDB/server.git
synced 2025-09-08 06:27:57 +03:00
Analysis: ======== As part of BUG#28642318 fix, two new test cases were added. The first test case tests a scenario where two sessions are present, in which the first session has a regular table named 't1' and another session has a temporary table named 't1'. Test executes a DELETE statement on regular table. These statements are captured from binary log and replayed back on new client connection to prove that DELETE statement is applied successfully. Note that the binlog contains only CREATE TEMPORARY TABLE part hence a temporary table gets created in new connection. This replaying logic is implemented by using '--exec $MYSQL' command. If the new connection gets disconnected within the scope of first test case the test passes, i.e the temporary table gets dropped as part thread cleanup. But on slow platforms the connection gets closed at the time of execution of test case 2. When the temporary table is dropped as part thread cleanup a "DROP TEMPORARY TABLE t1" is written into the binary log. In test case two the same sessions continue to exist and and table names are reused to test a new bug scenario. The additional "DROP TEMPORARY TABLE" command drops second test specific tables which results in "Unknown table" error. Fix: ==== Rename the second case specific table to 't2'. Even if the close connection from test case one happens later the drop command with has 'DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t1`' will not result in an error.
177 lines
5.0 KiB
Plaintext
177 lines
5.0 KiB
Plaintext
--source include/have_innodb.inc
|
|
|
|
--disable_warnings
|
|
DROP DATABASE IF EXISTS `drop-temp+table-test`;
|
|
--enable_warnings
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
connection con1;
|
|
RESET MASTER;
|
|
CREATE DATABASE `drop-temp+table-test`;
|
|
USE `drop-temp+table-test`;
|
|
CREATE TEMPORARY TABLE shortn1 (a INT);
|
|
CREATE TEMPORARY TABLE `table:name` (a INT);
|
|
CREATE TEMPORARY TABLE shortn2 (a INT);
|
|
|
|
##############################################################################
|
|
# MDEV-20091: DROP TEMPORARY TABLE IF EXISTS statements will be written
|
|
# to binlog only if the corresponding temporary table exists.
|
|
##############################################################################
|
|
CREATE TEMPORARY TABLE tmp(c1 int);
|
|
CREATE TEMPORARY TABLE tmp1(c1 int);
|
|
CREATE TEMPORARY TABLE tmp2(c1 int);
|
|
CREATE TEMPORARY TABLE tmp3(c1 int);
|
|
CREATE TABLE t(c1 int);
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp;
|
|
|
|
--disable_warnings
|
|
# Post MDEV-20091: Following DROP TEMPORARY TABLE statement should not be
|
|
# logged as the table is already dropped above.
|
|
DROP TEMPORARY TABLE IF EXISTS tmp;
|
|
|
|
# Post MDEV-20091: Only DROP TEMPORARY TABLE statement should be written only
|
|
# for 'tmp1' table.
|
|
DROP TEMPORARY TABLE IF EXISTS tmp, tmp1;
|
|
DROP TEMPORARY TABLE tmp3;
|
|
|
|
#In RBR, tmp2 will NOT be binlogged, because it is a temporary table.
|
|
DROP TABLE IF EXISTS tmp2, t;
|
|
|
|
#In RBR, tmp2 will be binlogged, because it does not exist and master do not know
|
|
# whether it is a temporary table or not.
|
|
DROP TABLE IF EXISTS tmp2, t;
|
|
--enable_warnings
|
|
|
|
SELECT GET_LOCK("a",10);
|
|
|
|
#
|
|
# BUG48216 Replication fails on all slaves after upgrade to 5.0.86 on master
|
|
#
|
|
# When the session is closed, any temporary tables of the session are dropped
|
|
# and are binlogged. But it will be binlogged with a wrong database name when
|
|
# the length of the database name('drop-temp-table-test') is greater than the
|
|
# current database name('test').
|
|
#
|
|
USE test;
|
|
disconnect con1;
|
|
|
|
connection con2;
|
|
# We want to SHOW BINLOG EVENTS, to know what was logged. But there is no
|
|
# guarantee that logging of the terminated con1 has been done yet.
|
|
# To be sure that logging has been done, we use a user lock.
|
|
SELECT GET_LOCK("a",10);
|
|
let $VERSION=`SELECT VERSION()`;
|
|
source include/show_binlog_events.inc;
|
|
DROP DATABASE `drop-temp+table-test`;
|
|
|
|
|
|
#
|
|
# Bug #54842: DROP TEMPORARY TABLE not binlogged after manual switching binlog format to ROW
|
|
#
|
|
# Sanity test. Checking that implicit DROP event is logged.
|
|
#
|
|
# After BUG#52616, the switch to ROW mode becomes effective even
|
|
# if there are open temporary tables. As such the implicit drop
|
|
# for temporary tables on session closing must be logged.
|
|
#
|
|
# MDEV-20091: DROP TEMPORARY TABLE IF EXISTS statements will be written to
|
|
# binlog only if the corresponding temporary table exists. In row based
|
|
# replication temporary tables are not replicated hence their corresponding
|
|
# DROP TEMPORARY TABLE statement will be not be written to binary log upon
|
|
# session closure.
|
|
#
|
|
|
|
RESET MASTER;
|
|
|
|
CREATE TABLE t1 ( i text );
|
|
|
|
--connect(con1,localhost,root,,)
|
|
CREATE TEMPORARY TABLE ttmp1 ( i text );
|
|
SET @@session.binlog_format=ROW;
|
|
INSERT INTO t1 VALUES ('1');
|
|
SELECT @@session.binlog_format;
|
|
--disconnect con1
|
|
|
|
-- connection default
|
|
if (!`SELECT @@BINLOG_FORMAT = 'ROW'`) {
|
|
--let $wait_binlog_event= DROP
|
|
--source include/wait_for_binlog_event.inc
|
|
}
|
|
-- source include/show_binlog_events.inc
|
|
RESET MASTER;
|
|
|
|
DROP TABLE t1;
|
|
|
|
# End of 4.1 tests
|
|
|
|
|
|
--echo #
|
|
--echo # BUG#28642318: POINT IN TIME RECOVERY USING MYSQLBINLOG BROKEN
|
|
--echo # WITH TEMPORARY TABLE -> ERRORS
|
|
|
|
--echo # Test case for DELETE query.
|
|
|
|
RESET MASTER;
|
|
connect (con1,localhost,root,,);
|
|
|
|
--echo # Set up.
|
|
--connection default
|
|
--disable_warnings
|
|
SET @save_binlog_format= @@session.binlog_format;
|
|
SET @@session.binlog_format=STATEMENT;
|
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
|
CREATE TABLE t1 (a INT) ENGINE=INNODB;
|
|
|
|
--connection con1
|
|
SET @@session.binlog_format=STATEMENT;
|
|
CREATE TEMPORARY TABLE t1 (b BLOB) ENGINE=INNODB;
|
|
|
|
--connection default
|
|
DELETE d1, d2 FROM t1 AS d1, t1 AS d2 WHERE d1.a<>d2.a;
|
|
|
|
--exec $MYSQL_BINLOG --force-if-open $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/bug28642318.sql
|
|
|
|
--connection default
|
|
DROP TABLE t1;
|
|
|
|
--echo # DELETE query fails with table re-open error without patch.
|
|
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug28642318.sql
|
|
|
|
--echo # Clean up.
|
|
--connection con1
|
|
DROP TABLE IF EXISTS t1;
|
|
|
|
--connection default
|
|
DROP TABLE IF EXISTS t1;
|
|
RESET MASTER;
|
|
|
|
--echo # Test case for DROP query.
|
|
|
|
--connection default
|
|
CREATE TABLE t2 (a INT) ENGINE=INNODB;
|
|
|
|
--connection con1
|
|
CREATE TEMPORARY TABLE t2 (b BLOB) ENGINE=INNODB;
|
|
|
|
--connection default
|
|
DROP TABLE t2;
|
|
|
|
--connection con1
|
|
DROP TABLE t2;
|
|
|
|
--connection default
|
|
--exec $MYSQL_BINLOG --force-if-open $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/bug28642318.sql
|
|
|
|
--echo # DROP table query fails with unknown table error without patch.
|
|
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug28642318.sql
|
|
|
|
--echo # Clean up
|
|
--connection default
|
|
SET @@session.binlog_format= @save_binlog_format;
|
|
RESET MASTER;
|
|
|
|
--disconnect con1
|
|
--enable_warnings
|