mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
BUG#43046: mixed mode switch to row format with temp table lead
to wrong result When using MIXED mode and issuing 'CREATE TEMPORARY TABLE t_tmp', the statement is logged if the current binlogging mode is STATEMENT. This causes the slave to replay the instruction and create the temporary table as well. If there is no switch to ROW mode, and later on a 'DROP TEMPORARY TABLE t_tmp' is issued, then this statement will also be logged and the slave will remove/close the temporary table. However, if there is a switch to ROW mode between the CREATE and DROP TEMPORARY table, the DROP statement will not be logged, leaving the slave with a dangling temporary table. This patch addresses this, by always logging a DROP TEMPORARY TABLE IF EXISTS when in mixed mode and a drop statement is issued for temporary table(s). mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result: Updated result file. mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test: Added test case. sql/sql_table.cc: When dropping table(s) in mixed mode and current statement logging is ROW, builds an extra DROP TEMPORARY TABLE IF EXISTS for temporary tables that are being dropped. Later, it logs the extra drop statement.
This commit is contained in:
@ -24,3 +24,48 @@ Slave_open_temp_tables 0
|
||||
[on master]
|
||||
DROP TABLE t1;
|
||||
[on slave]
|
||||
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;
|
||||
CREATE TABLE t1 (a int);
|
||||
CREATE TABLE t2 ( i1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (i1) );
|
||||
CREATE TABLE t3 ( i1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (i1) );
|
||||
CREATE TRIGGER tr1 AFTER DELETE ON t2 FOR EACH ROW INSERT INTO t3 () VALUES ();
|
||||
CREATE TEMPORARY TABLE t1_tmp (i1 int);
|
||||
ALTER TABLE t1_tmp ADD COLUMN b INT;
|
||||
DELETE FROM t2;
|
||||
CREATE TEMPORARY TABLE t2_tmp (a int);
|
||||
ALTER TABLE t1_tmp ADD COLUMN c INT;
|
||||
### assertion: assert that there is one open temp table on slave
|
||||
SHOW STATUS LIKE 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 1
|
||||
DROP TABLE t1_tmp, t2;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
DROP TEMPORARY TABLE t2_tmp;
|
||||
INSERT INTO t1 VALUES (2);
|
||||
### assertion: assert that slave has no temporary tables opened
|
||||
SHOW STATUS LIKE 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 0
|
||||
DROP TABLE t3, t1;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
slave-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a int)
|
||||
slave-bin.000001 # Query # # use `test`; CREATE TABLE t2 ( i1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (i1) )
|
||||
slave-bin.000001 # Query # # use `test`; CREATE TABLE t3 ( i1 INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (i1) )
|
||||
slave-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` TRIGGER tr1 AFTER DELETE ON t2 FOR EACH ROW INSERT INTO t3 () VALUES ()
|
||||
slave-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE t1_tmp (i1 int)
|
||||
slave-bin.000001 # Query # # use `test`; ALTER TABLE t1_tmp ADD COLUMN b INT
|
||||
slave-bin.000001 # Query # # use `test`; DROP TABLE `t2` /* generated by server */
|
||||
slave-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE IF EXISTS `t1_tmp` /* generated by server */
|
||||
slave-bin.000001 # Query # # BEGIN
|
||||
slave-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
slave-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
slave-bin.000001 # Query # # COMMIT
|
||||
slave-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE IF EXISTS `t2_tmp` /* generated by server */
|
||||
slave-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (2)
|
||||
slave-bin.000001 # Query # # use `test`; DROP TABLE t3, t1
|
||||
|
Reference in New Issue
Block a user