Commit e831e729 authored by Luis Soares's avatar Luis Soares

BUG#51055: Replication failure on duplicate key + traditional SQL

mode

When the master was executing in sql_mode='traditional' (which
implies that really_abort_on_warning returns TRUE - because of
MODE_STRICT_ALL_TABLES), the error code (ER_DUP_ENTRY in the
reported case) was not being set in the
Query_log_event. Therefore, even if a failure was to be expected
when replaying the statement on the slave, a failure would occur,
because the Query_log_event was not transporting the expected
error code, but 0 instead.

This was because when the master was getting the error code to
set it in the Query_log_event, the executing thread would be
assumed to have been killed:
THD::killed==THD::KILL_BAD_DATA. This would make the error code
fetch routine not to check thd->main_da.sql_errno(), but instead
the thd->killed value. What's more, is that the server would
thd->killed value if thd->killed == THD::KILL_BAD_DATA and return
0 instead. So this is a double inconsistency, as the we should
not even check thd->killed but rather thd->main_da.sql_errno().

We fix this by extending the condition used to choose whether to
check the thd->main_da.sql_errno() or thd->killed, so that it
takes into consideration the case when:
thd->killed==THD::KILL_BAD_DATA.
parent 302f50c3
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
CREATE TABLE t1 (pk integer auto_increment , primary key (pk));
SET SESSION SQL_MODE='traditional';
# **** [MASTER] *****
# action: raise DUP KEY error (error code should be set in the
# query log event)
INSERT INTO t1 (`pk`) VALUES (1), (1);
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
DROP TABLE t1;
# **** [ sync slave with master ] ****
# assertion: sync slave with master makes slave not to stop with
# duplicate key error (because it has received event
# with expected error code).
-- source include/master-slave.inc
-- source include/have_binlog_format_statement.inc
#
# Bug #51055 Replication failure on duplicate key + traditional SQL mode
#
CREATE TABLE t1 (pk integer auto_increment , primary key (pk));
SET SESSION SQL_MODE='traditional';
-- echo # **** [MASTER] *****
-- echo # action: raise DUP KEY error (error code should be set in the
-- echo # query log event)
-- error ER_DUP_ENTRY
INSERT INTO t1 (`pk`) VALUES (1), (1);
DROP TABLE t1;
-- echo # **** [ sync slave with master ] ****
-- echo # assertion: sync slave with master makes slave not to stop with
-- echo # duplicate key error (because it has received event
-- echo # with expected error code).
-- sync_slave_with_master
......@@ -4679,7 +4679,7 @@ int query_error_code(THD *thd, bool not_killed)
{
int error;
if (not_killed)
if (not_killed || (thd->killed == THD::KILL_BAD_DATA))
{
error= thd->is_error() ? thd->main_da.sql_errno() : 0;
......
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