diff --git a/mysql-test/suite/rpl/r/rpl_stm_sql_mode.result b/mysql-test/suite/rpl/r/rpl_stm_sql_mode.result new file mode 100644 index 00000000000..fd143fc8a50 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_stm_sql_mode.result @@ -0,0 +1,18 @@ +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). diff --git a/mysql-test/suite/rpl/t/rpl_stm_sql_mode.test b/mysql-test/suite/rpl/t/rpl_stm_sql_mode.test new file mode 100644 index 00000000000..d5aac4a43e2 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_stm_sql_mode.test @@ -0,0 +1,24 @@ +-- 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 diff --git a/sql/log.cc b/sql/log.cc index b7313a988c4..b75650cfec7 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -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;