BUG#35583 mysqlbinlog replay fails with ERROR 1146 when temp tables are used
When using CREATE TEMPORARY TABLE LIKE to create a temporary table, or using TRUNCATE to delete all rows of a temporary table, they did not set the tmp_table_used flag, and cause the omission of "SET @@session.pseudo_thread_id" when dumping binlog with mysqlbinlog, and cause error when replay the statements. This patch fixed the problem by setting tmp_table_used in these two cases. (Done by He Zhenxing 2009-01-12) mysql-test/suite/binlog/r/binlog_tmp_table.result: Add test case for BUG#35583 mysql-test/suite/binlog/t/binlog_tmp_table.test: Add test case for BUG#35583 sql/sql_delete.cc: set thd->tmp_table_used when truncate temporary table sql/sql_table.cc: set thd->tmp_table_used when using create like to create temporary tables
This commit is contained in:
parent
34dabc062f
commit
23d032c34e
30
mysql-test/suite/binlog/r/binlog_tmp_table.result
Normal file
30
mysql-test/suite/binlog/r/binlog_tmp_table.result
Normal file
@ -0,0 +1,30 @@
|
||||
create table foo (a int);
|
||||
flush logs;
|
||||
create temporary table tmp1_foo like foo;
|
||||
create temporary table tmp2_foo (a int);
|
||||
insert into tmp1_foo values (1), (2), (3), (4);
|
||||
replace into tmp2_foo values (1), (2), (3), (4);
|
||||
update tmp1_foo set a=2*a-1;
|
||||
update tmp2_foo set a=2*a;
|
||||
delete from tmp1_foo where a < 5;
|
||||
delete from tmp2_foo where a < 5;
|
||||
insert into foo select * from tmp1_foo;
|
||||
insert into foo select * from tmp2_foo;
|
||||
truncate table tmp1_foo;
|
||||
truncate table tmp2_foo;
|
||||
flush logs;
|
||||
select * from foo;
|
||||
a
|
||||
5
|
||||
7
|
||||
6
|
||||
8
|
||||
drop table foo;
|
||||
create table foo (a int);
|
||||
select * from foo;
|
||||
a
|
||||
5
|
||||
7
|
||||
6
|
||||
8
|
||||
drop table foo;
|
82
mysql-test/suite/binlog/t/binlog_tmp_table.test
Normal file
82
mysql-test/suite/binlog/t/binlog_tmp_table.test
Normal file
@ -0,0 +1,82 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Test if statements used temporary tables are binlogged correctly
|
||||
#
|
||||
# ==== Method ====
|
||||
#
|
||||
# Use two connections, use temporary tables on both of them, and by
|
||||
# switching connections between statements, the test can check if the
|
||||
# statements are logged with the correct thread id.
|
||||
#
|
||||
# The statements current tested include:
|
||||
# CREATE TEMPORARY TABLE
|
||||
# CREATE TEMPORARY TABLE LIKE
|
||||
# INSERT
|
||||
# REPLACE
|
||||
# UPDATE
|
||||
# INSERT SELECT
|
||||
# TRUNCATE
|
||||
#
|
||||
# Note: When adding new query statements, please add them between the
|
||||
# two 'flush logs'. And aslo please make sure the connection is
|
||||
# switched between each statement.
|
||||
#
|
||||
# ==== Related bugs ====
|
||||
#
|
||||
# BUG#35583 mysqlbinlog replay fails with ERROR 1146 when temp tables are used
|
||||
#
|
||||
source include/have_log_bin.inc;
|
||||
source include/have_binlog_format_mixed_or_statement.inc;
|
||||
|
||||
connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
connect (master1,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
|
||||
create table foo (a int);
|
||||
|
||||
flush logs;
|
||||
|
||||
connection master;
|
||||
create temporary table tmp1_foo like foo;
|
||||
connection master1;
|
||||
create temporary table tmp2_foo (a int);
|
||||
|
||||
connection master;
|
||||
insert into tmp1_foo values (1), (2), (3), (4);
|
||||
connection master1;
|
||||
replace into tmp2_foo values (1), (2), (3), (4);
|
||||
|
||||
connection master;
|
||||
update tmp1_foo set a=2*a-1;
|
||||
connection master1;
|
||||
update tmp2_foo set a=2*a;
|
||||
|
||||
connection master;
|
||||
delete from tmp1_foo where a < 5;
|
||||
connection master1;
|
||||
delete from tmp2_foo where a < 5;
|
||||
|
||||
connection master;
|
||||
insert into foo select * from tmp1_foo;
|
||||
connection master1;
|
||||
insert into foo select * from tmp2_foo;
|
||||
|
||||
connection master;
|
||||
truncate table tmp1_foo;
|
||||
connection master1;
|
||||
truncate table tmp2_foo;
|
||||
|
||||
flush logs;
|
||||
|
||||
connection default;
|
||||
select * from foo;
|
||||
|
||||
# prepare for the replay
|
||||
drop table foo;
|
||||
create table foo (a int);
|
||||
|
||||
# replay from binary log
|
||||
exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/log/master-bin.000002 | $MYSQL;
|
||||
select * from foo;
|
||||
|
||||
# clean up
|
||||
drop table foo;
|
@ -1010,6 +1010,9 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
||||
share->db.str,
|
||||
share->table_name.str, 1))))
|
||||
(void) rm_temporary_table(table_type, path);
|
||||
else
|
||||
thd->thread_specific_used= TRUE;
|
||||
|
||||
free_table_share(share);
|
||||
my_free((char*) table,MYF(0));
|
||||
/*
|
||||
|
@ -4983,6 +4983,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
|
||||
dst_path); /* purecov: inspected */
|
||||
goto err; /* purecov: inspected */
|
||||
}
|
||||
thd->thread_specific_used= TRUE;
|
||||
}
|
||||
else if (err)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user