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->db.str,
|
||||||
share->table_name.str, 1))))
|
share->table_name.str, 1))))
|
||||||
(void) rm_temporary_table(table_type, path);
|
(void) rm_temporary_table(table_type, path);
|
||||||
|
else
|
||||||
|
thd->thread_specific_used= TRUE;
|
||||||
|
|
||||||
free_table_share(share);
|
free_table_share(share);
|
||||||
my_free((char*) table,MYF(0));
|
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 */
|
dst_path); /* purecov: inspected */
|
||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
|
thd->thread_specific_used= TRUE;
|
||||||
}
|
}
|
||||||
else if (err)
|
else if (err)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user