Commit 80da35a3 authored by Andrei's avatar Andrei Committed by Andrei Elkin

MDEV-27365 CREATE-or-REPLACE SEQUENCE is binlogged without DDL flag

CREATE-OR-REPLACE SEQUENCE is not logged with Gtid event DDL flag
which affects its slave parallel execution.
Unlike other DDL:s it can occur in concurrent execution with following transactions
which can lead to various errors, including asserts like

(mdl_request->type != MDL_INTENTION_EXCLUSIVE && mdl_request->type != MDL_EXCLUSIVE) || !(get_thd()->rgi_slave && get_thd()->rgi_slave->is_parallel_exec && lock->check_if_conflicting_replication_locks(this)

in MDL_context::acquire_lock.

Fixed to wrap internal statement level commit with save-
and-restore of TRANS_THD::m_unsafe_rollback_flags.
parent 5fd5e9ff
RESET MASTER;
CREATE OR REPLACE SEQUENCE s1;
DROP SEQUENCE s1;
FLUSH LOGS;
FOUND 2 /GTID [0-9]+-[0-9]+-[0-9]+/ in mysqlbinlog.sql
The same as above number of samples must be found:
FOUND 2 /GTID [0-9]+-[0-9]+-[0-9]+ ddl/ in mysqlbinlog.sql
End of the tests
# Check binlog properties of various DDL:s.
# Motivated by MDEV-27365.
#
--source include/have_log_bin.inc
--source include/have_binlog_format_mixed.inc
RESET MASTER;
# MDEV-27365 CREATE-or-REPLACE SEQUENCE bilogged without DDL flag
# Prove it is logged with the DDL flag.
CREATE OR REPLACE SEQUENCE s1;
# This one has been always correct.
DROP SEQUENCE s1;
FLUSH LOGS;
--let $MYSQLD_DATADIR= `select @@datadir`
--exec $MYSQL_BINLOG --base64-output=decode-rows $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog.sql
--let SEARCH_PATTERN= GTID [0-9]+-[0-9]+-[0-9]+
--let SEARCH_FILE= $MYSQLTEST_VARDIR/tmp/mysqlbinlog.sql
--source include/search_pattern_in_file.inc
--echo The same as above number of samples must be found:
--let SEARCH_PATTERN= GTID [0-9]+-[0-9]+-[0-9]+ ddl
--let SEARCH_FILE= $MYSQLTEST_VARDIR/tmp/mysqlbinlog.sql
--source include/search_pattern_in_file.inc
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog.sql
--echo End of the tests
......@@ -365,9 +365,14 @@ bool sequence_insert(THD *thd, LEX *lex, TABLE_LIST *org_table_list)
seq->reserved_until= seq->start;
error= seq->write_initial_sequence(table);
{
uint save_unsafe_rollback_flags=
thd->transaction.stmt.m_unsafe_rollback_flags;
if (trans_commit_stmt(thd))
error= 1;
thd->transaction.stmt.m_unsafe_rollback_flags=
save_unsafe_rollback_flags;
}
if (trans_commit_implicit(thd))
error= 1;
......
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