mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 06:22:28 +01:00
7768ccbb54
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.
24 lines
772 B
Text
24 lines
772 B
Text
-- 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
|