From 736ca14323fa16e409378f0da8005bce4be6dcf8 Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 22 May 2020 15:42:11 +0300 Subject: [PATCH] Don't crash if creating sequence under XA MDEV-22002 Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed upon CREATE TEMPORARY SEQUENCE under XA --- mysql-test/main/xa.result | 13 +++++++++++++ mysql-test/main/xa.test | 26 ++++++++++++++++++++++++++ sql/sql_sequence.cc | 6 ++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/xa.result b/mysql-test/main/xa.result index f77c0afdec5..f37a3c36531 100644 --- a/mysql-test/main/xa.result +++ b/mysql-test/main/xa.result @@ -345,3 +345,16 @@ connection default; XA END 'xid1'; XA ROLLBACK 'xid1'; DROP TABLE t1, t2, t3; +XA BEGIN 'xid'; +CREATE TEMPORARY SEQUENCE s; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state +XA END 'xid'; +XA ROLLBACK 'xid'; +XA BEGIN 'xid'; +CREATE SEQUENCE s; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state +XA END 'xid'; +XA ROLLBACK 'xid'; +# +# End of 10.3 tests +# diff --git a/mysql-test/main/xa.test b/mysql-test/main/xa.test index 176ef6aa760..ce8f3834b03 100644 --- a/mysql-test/main/xa.test +++ b/mysql-test/main/xa.test @@ -478,3 +478,29 @@ DROP TABLE t1, t2, t3; --source include/wait_until_count_sessions.inc +# +# MDEV-22002 Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' +# failed upon CREATE TEMPORARY SEQUENCE under XA +# + +XA BEGIN 'xid'; + +--error ER_XAER_RMFAIL +CREATE TEMPORARY SEQUENCE s; + +XA END 'xid'; + +XA ROLLBACK 'xid'; + +XA BEGIN 'xid'; + +--error ER_XAER_RMFAIL +CREATE SEQUENCE s; + +XA END 'xid'; + +XA ROLLBACK 'xid'; + +--echo # +--echo # End of 10.3 tests +--echo # diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index b69b52505f4..96c1cd19433 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -355,8 +355,10 @@ bool sequence_insert(THD *thd, LEX *lex, TABLE_LIST *org_table_list) seq->reserved_until= seq->start; error= seq->write_initial_sequence(table); - trans_commit_stmt(thd); - trans_commit_implicit(thd); + if (trans_commit_stmt(thd)) + error= 1; + if (trans_commit_implicit(thd)) + error= 1; if (!temporary_table) {