Commit 8a8d4764 authored by unknown's avatar unknown

Bug#8412: For replication to work correctly, the prologue and

epilogue to an SQL statement should not have an error code even
when the SQL statement itself has an error code.


mysql-test/r/rpl_insert_id.result:
  Adding test to ensure that slave handles error statement gracefully.
mysql-test/t/rpl_insert_id.test:
  Adding test to ensure that slave handles error statement gracefully.
sql/log.cc:
  Setting error code to 0 for SQL statement prologue and epilogue.
parent 4c21a10f
...@@ -69,3 +69,8 @@ b c ...@@ -69,3 +69,8 @@ b c
9 13 9 13
drop table t1; drop table t1;
drop table t2; drop table t2;
SET TIMESTAMP=1000000000;
CREATE TABLE t1 ( a INT UNIQUE );
SET FOREIGN_KEY_CHECKS=0;
INSERT INTO t1 VALUES (1),(1);
Duplicate entry '1' for key 1
...@@ -62,3 +62,19 @@ drop table t2; ...@@ -62,3 +62,19 @@ drop table t2;
save_master_pos; save_master_pos;
connection slave; connection slave;
sync_with_master; sync_with_master;
#
# Bug#8412: Error codes reported in binary log for CHARACTER SET,
# FOREIGN_KEY_CHECKS
#
connection master;
SET TIMESTAMP=1000000000;
CREATE TABLE t1 ( a INT UNIQUE );
SET FOREIGN_KEY_CHECKS=0;
--error 1062
INSERT INTO t1 VALUES (1),(1);
sync_slave_with_master;
...@@ -1182,6 +1182,7 @@ bool MYSQL_LOG::write(Log_event* event_info) ...@@ -1182,6 +1182,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
p= strmov(strmov(buf, "SET CHARACTER SET "), p= strmov(strmov(buf, "SET CHARACTER SET "),
thd->variables.convert_set->name); thd->variables.convert_set->name);
Query_log_event e(thd, buf, (ulong) (p - buf), 0); Query_log_event e(thd, buf, (ulong) (p - buf), 0);
e.error_code = 0; // This statement cannot fail (see [1]).
e.set_log_pos(this); e.set_log_pos(this);
if (e.write(file)) if (e.write(file))
goto err; goto err;
...@@ -1199,12 +1200,22 @@ bool MYSQL_LOG::write(Log_event* event_info) ...@@ -1199,12 +1200,22 @@ bool MYSQL_LOG::write(Log_event* event_info)
{ {
Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=0", 24, 0); Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=0", 24, 0);
e.set_log_pos(this); e.set_log_pos(this);
e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file)) if (e.write(file))
goto err; goto err;
} }
} }
/* Write the SQL command */ /*
Write the SQL command
[1] If this statement has an error code, the slave is required to fail
with the same error code or stop. The preamble and epilogue should
*not* have this error code since the execution of those is
guaranteed *not* to produce any error code. This would therefore
stop the slave even if the execution of the real statement can be
handled gracefully by the slave.
*/
event_info->set_log_pos(this); event_info->set_log_pos(this);
if (event_info->write(file)) if (event_info->write(file))
...@@ -1218,6 +1229,7 @@ bool MYSQL_LOG::write(Log_event* event_info) ...@@ -1218,6 +1229,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
{ {
Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=1", 24, 0); Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=1", 24, 0);
e.set_log_pos(this); e.set_log_pos(this);
e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file)) if (e.write(file))
goto err; goto err;
} }
...@@ -1226,6 +1238,7 @@ bool MYSQL_LOG::write(Log_event* event_info) ...@@ -1226,6 +1238,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
{ {
Query_log_event e(thd, "SET CHARACTER SET DEFAULT", 25, 0); Query_log_event e(thd, "SET CHARACTER SET DEFAULT", 25, 0);
e.set_log_pos(this); e.set_log_pos(this);
e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file)) if (e.write(file))
goto err; goto err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment