mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
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.
This commit is contained in:
parent
60ef324416
commit
7768ccbb54
3 changed files with 43 additions and 1 deletions
18
mysql-test/suite/rpl/r/rpl_stm_sql_mode.result
Normal file
18
mysql-test/suite/rpl/r/rpl_stm_sql_mode.result
Normal file
|
@ -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).
|
24
mysql-test/suite/rpl/t/rpl_stm_sql_mode.test
Normal file
24
mysql-test/suite/rpl/t/rpl_stm_sql_mode.test
Normal file
|
@ -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
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue