diff options
author | mkaruza <mario.karuza@galeracluster.com> | 2020-06-28 23:03:38 +0200 |
---|---|---|
committer | mkaruza <mario.karuza@galeracluster.com> | 2020-06-28 23:07:41 +0200 |
commit | 2b8b7394a129ab27225a1284bab253a6714aaf03 (patch) | |
tree | 6ab039d9bafca53d090a4552ab95a15b541bb7dc | |
parent | d4d42a6ad07d4b6a3ea3f4f5aee29da0fd887675 (diff) | |
download | mariadb-git-2b8b7394a129ab27225a1284bab253a6714aaf03.tar.gz |
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.
-rw-r--r-- | mysql-test/suite/galera/r/galera_lock_tables_in_transaction.result | 12 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test | 21 | ||||
-rw-r--r-- | sql/sql_parse.cc | 6 |
3 files changed, 39 insertions, 0 deletions
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) { |