Commit 632b1deb authored by Teemu Ollakka's avatar Teemu Ollakka Committed by GitHub

MDEV-21025 Server crashes on START TRANSACTION after INSERT IGNORE (#1489)

If a transaction had no effect due to INSERT IGNORE and a new
transaction was started with START TRANSACTION without committing
the previous one, the server crashed on assertion when starting
a new wsrep transaction.

As a fix, refined the condition to do wsrep_commit_empty() at the end
of the ha_commit_trans().
parent 68ceb4b4
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
START TRANSACTION;
INSERT INTO t1 (f1) VALUES (1);
START TRANSACTION;
INSERT IGNORE INTO t1 (f1) VALUES (1);
Warnings:
Warning 1062 Duplicate entry '1' for key 'PRIMARY'
START TRANSACTION;
DROP TABLE t1;
#
# MDEV-21205
#
# Start transaction after INSERT IGNORE which had no effect and
# kept the transaction open caused an assertion on the following
# START TRANSACTION because the empty transaction was not properly
# terminated.
#
--source include/galera_cluster.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
START TRANSACTION;
INSERT INTO t1 (f1) VALUES (1);
START TRANSACTION;
# This INSERT succeeds with duplicate key warning due to IGNORE clause
# and keeps the transaction open. The following START TRANSACTION causes
# an assertion if the bug is present.
INSERT IGNORE INTO t1 (f1) VALUES (1);
START TRANSACTION;
DROP TABLE t1;
......@@ -1705,7 +1705,8 @@ int ha_commit_trans(THD *thd, bool all)
thd->mdl_context.release_lock(mdl_request.ticket);
}
#ifdef WITH_WSREP
if (wsrep_is_active(thd) && is_real_trans && !error && (rw_ha_count == 0) &&
if (wsrep_is_active(thd) && is_real_trans && !error &&
(rw_ha_count == 0 || all) &&
wsrep_not_committed(thd))
{
wsrep_commit_empty(thd, all);
......
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