summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mats@mysql.com>2005-02-14 18:39:33 +0100
committerunknown <mats@mysql.com>2005-02-14 18:39:33 +0100
commit8a8d476453437b27df0bc7ff63d138c743df11f1 (patch)
treeb2047ef7136ef2e2aba15fe0f72b9b20ecbf106e
parent4c21a10f27c6a15690b5640352d23f1c111ac729 (diff)
downloadmariadb-git-8a8d476453437b27df0bc7ff63d138c743df11f1.tar.gz
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.
-rw-r--r--mysql-test/r/rpl_insert_id.result5
-rw-r--r--mysql-test/t/rpl_insert_id.test16
-rw-r--r--sql/log.cc15
3 files changed, 35 insertions, 1 deletions
diff --git a/mysql-test/r/rpl_insert_id.result b/mysql-test/r/rpl_insert_id.result
index d2dfbb05675..da815241bbe 100644
--- a/mysql-test/r/rpl_insert_id.result
+++ b/mysql-test/r/rpl_insert_id.result
@@ -69,3 +69,8 @@ b c
9 13
drop table t1;
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
diff --git a/mysql-test/t/rpl_insert_id.test b/mysql-test/t/rpl_insert_id.test
index a6da44de456..33d6516632a 100644
--- a/mysql-test/t/rpl_insert_id.test
+++ b/mysql-test/t/rpl_insert_id.test
@@ -62,3 +62,19 @@ drop table t2;
save_master_pos;
connection slave;
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;
+
+
+
+
diff --git a/sql/log.cc b/sql/log.cc
index b46a8de056e..18c644473f1 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1182,6 +1182,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
p= strmov(strmov(buf, "SET CHARACTER SET "),
thd->variables.convert_set->name);
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);
if (e.write(file))
goto err;
@@ -1199,12 +1200,22 @@ bool MYSQL_LOG::write(Log_event* event_info)
{
Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=0", 24, 0);
e.set_log_pos(this);
+ e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file))
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);
if (event_info->write(file))
@@ -1218,6 +1229,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
{
Query_log_event e(thd, "SET FOREIGN_KEY_CHECKS=1", 24, 0);
e.set_log_pos(this);
+ e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file))
goto err;
}
@@ -1226,6 +1238,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
{
Query_log_event e(thd, "SET CHARACTER SET DEFAULT", 25, 0);
e.set_log_pos(this);
+ e.error_code = 0; // This statement cannot fail (see [1]).
if (e.write(file))
goto err;
}