diff --git a/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result new file mode 100644 index 00000000000..feffefc9dad --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result @@ -0,0 +1,26 @@ +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; +==== Initialize ==== +[on master] +CREATE TABLE t1 (a CHAR(48)); +CREATE TEMPORARY TABLE t1_tmp1(a INT); +INSERT INTO t1 VALUES (UUID()); +[on slave] +==== Verify results on slave ==== +SHOW STATUS LIKE "Slave_open_temp_tables"; +Variable_name Value +Slave_open_temp_tables 1 +[on master] +[on slave] +==== Verify results on slave ==== +SHOW STATUS LIKE "Slave_open_temp_tables"; +Variable_name Value +Slave_open_temp_tables 0 +==== Clean up ==== +[on master] +DROP TABLE t1; +[on slave] diff --git a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test new file mode 100644 index 00000000000..1fe484b7c27 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test @@ -0,0 +1,49 @@ +# ==== Purpose ==== +# +# Test that temporary tables are correctly replicated after switching to ROW format in MIX mode. +# This test case will test the condition of the bug#40013. +# The test step is: +# 1: create temp table on connection 'master'; +# 2: switch to ROW format using 'INSERT INTO t1 VALUES (UUID());' +# 3: disconnect 'master' and connect to a new connection 'master1'; +# 4: sync to slave and check the number of temp tables on slave. +# + +source include/master-slave.inc; +source include/have_binlog_format_mixed.inc; + +--echo ==== Initialize ==== + +--echo [on master] +--connection master + +CREATE TABLE t1 (a CHAR(48)); +CREATE TEMPORARY TABLE t1_tmp1(a INT); +INSERT INTO t1 VALUES (UUID()); + +--echo [on slave] +sync_slave_with_master; + +--echo ==== Verify results on slave ==== +SHOW STATUS LIKE "Slave_open_temp_tables"; + +--echo [on master] +--connection master + +disconnect master; +--connection master1 + +--echo [on slave] +sync_slave_with_master; + +--echo ==== Verify results on slave ==== +SHOW STATUS LIKE "Slave_open_temp_tables"; + +--echo ==== Clean up ==== + +--echo [on master] +--connection master1 +DROP TABLE t1; + +--echo [on slave] +sync_slave_with_master; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6db9f1df0f2..7602b1187aa 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1440,7 +1440,8 @@ void close_temporary_tables(THD *thd) if (!thd->temporary_tables) return; - if (!mysql_bin_log.is_open() || thd->current_stmt_binlog_row_based) + if (!mysql_bin_log.is_open() || + (thd->current_stmt_binlog_row_based && thd->variables.binlog_format == BINLOG_FORMAT_ROW)) { TABLE *tmp_next; for (table= thd->temporary_tables; table; table= tmp_next)