mirror of
https://github.com/MariaDB/server.git
synced 2025-02-04 21:02:17 +01:00
9f4ba624e2
Problem: In regular replication, when master binlogged using statement format slave might not have written an event to its binary log when the Query event aimed at a temporary table. Specifically this was observed with LOAD DATA INFILE. This effect was possible because unlike master slave holds temporary tables in its pool and the master side check of existence of a temporary table at the format bin-logging decision did not apply. Solution: replace THD::has_thd_temporary_tables() with THD::has_temporary_tables which allows to identify temporary table presence on either side. -- Reviewed by Andrei Elkin.
30 lines
994 B
Text
30 lines
994 B
Text
include/rpl_init.inc [topology=1->2->3]
|
|
call mtr.add_suppression('Unsafe statement written to the binary log using ');
|
|
connection server_1;
|
|
set binlog_format=statement;
|
|
#first bug
|
|
create table t1 (a int);
|
|
create temporary table tmp like t1;
|
|
load data local infile 'MYSQLTEST_VARDIR/load_data' INTO TABLE tmp;
|
|
insert into t1 select * from tmp;
|
|
#second bug
|
|
create table t2 (a int);
|
|
create temporary table tmp2 like t2;
|
|
insert into tmp2 values(10);
|
|
update tmp2 set a = 20 limit 1;
|
|
Warnings:
|
|
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted
|
|
insert into t2 select * from tmp2;
|
|
connection server_2;
|
|
connection server_3;
|
|
#t1 should have 2 rows
|
|
select count(*) = 2 from t1;
|
|
count(*) = 2
|
|
1
|
|
#t2 should have 1 rows with a = 20
|
|
select * from t2;
|
|
a
|
|
20
|
|
connection server_1;
|
|
drop table t1, t2, tmp, tmp2;
|
|
include/rpl_end.inc
|