From 2b8b7394a129ab27225a1284bab253a6714aaf03 Mon Sep 17 00:00:00 2001 From: mkaruza Date: Sun, 28 Jun 2020 23:03:38 +0200 Subject: MDEV-22222: Assertion `state() == s_executing || state() == s_preparing || state() == s_prepared || state() == s_must_abort || state() == s_aborting || state() == s_cert_failed || state() == s_must_replay' failed in wsrep::transaction::before_rollback LOCK TABLE will do implicit commit, we need to properly handle transaction after commit. --- .../r/galera_lock_tables_in_transaction.result | 12 ++++++++++++ .../galera/t/galera_lock_tables_in_transaction.test | 21 +++++++++++++++++++++ sql/sql_parse.cc | 6 ++++++ 3 files changed, 39 insertions(+) create mode 100644 mysql-test/suite/galera/r/galera_lock_tables_in_transaction.result create mode 100644 mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test diff --git a/mysql-test/suite/galera/r/galera_lock_tables_in_transaction.result b/mysql-test/suite/galera/r/galera_lock_tables_in_transaction.result new file mode 100644 index 00000000000..68691a4efd2 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_lock_tables_in_transaction.result @@ -0,0 +1,12 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1); +LOCK TABLES t2 READ; +ERROR 42S02: Table 'test.t2' doesn't exist +START TRANSACTION; +INSERT INTO t1 VALUES (1); +LOCK TABLES t1 READ; +UNLOCK TABLES; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test b/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test new file mode 100644 index 00000000000..5cb7347639c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test @@ -0,0 +1,21 @@ +# +# Check `LOCK TABLES` command with or without existing table in database. +# Test case for MDEV-22222 / MDEV-22223 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +--error ER_NO_SUCH_TABLE +LOCK TABLES t2 READ; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +LOCK TABLES t1 READ; +UNLOCK TABLES; + +DROP TABLE t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index a7f2f472b0a..69ffbed1ca6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4998,6 +4998,12 @@ mysql_execute_command(THD *thd) if (res) goto error; +#ifdef WITH_WSREP + /* Clean up the previous transaction on implicit commit. */ + if (wsrep_on(thd) && !wsrep_not_committed(thd) && wsrep_after_statement(thd)) + goto error; +#endif + /* We can't have any kind of table locks while backup is active */ if (thd->current_backup_stage != BACKUP_FINISHED) { -- cgit v1.2.1