From b7b2e009b3fbe4cb41a368486f385e346a1d7494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 14 Jul 2025 10:31:56 +0300 Subject: [PATCH] MDEV-37215 SELECT FOR UPDATE crash in SERIALIZABLE ha_innobase::store_lock(): Set also trx->will_lock when starting a transaction at SERIALIZABLE isolation level. This fixes up commit 7fbbbc983f054a9c9c7f36ea8a9778ff3793a151 (MDEV-36330). --- mysql-test/suite/innodb/r/lock_isolation.result | 9 +++++++++ mysql-test/suite/innodb/t/lock_isolation.test | 10 ++++++++++ storage/innobase/handler/ha_innodb.cc | 1 + 3 files changed, 20 insertions(+) diff --git a/mysql-test/suite/innodb/r/lock_isolation.result b/mysql-test/suite/innodb/r/lock_isolation.result index 7c24ed01f4c..2044f001ad8 100644 --- a/mysql-test/suite/innodb/r/lock_isolation.result +++ b/mysql-test/suite/innodb/r/lock_isolation.result @@ -283,4 +283,13 @@ COMMIT; disconnect consistent; connection default; DROP TABLE t1,t2; +# +# MDEV-37215 SELECT...FOR UPDATE crash under SERIALIZABLE +# +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; +SELECT * FROM t1 FOR UPDATE; +a +DROP TABLE t1; +SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; # End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/lock_isolation.test b/mysql-test/suite/innodb/t/lock_isolation.test index 3c5544321c7..7506754cf8a 100644 --- a/mysql-test/suite/innodb/t/lock_isolation.test +++ b/mysql-test/suite/innodb/t/lock_isolation.test @@ -295,5 +295,15 @@ COMMIT; --connection default DROP TABLE t1,t2; +--echo # +--echo # MDEV-37215 SELECT...FOR UPDATE crash under SERIALIZABLE +--echo # + +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; +SELECT * FROM t1 FOR UPDATE; +DROP TABLE t1; +SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; + --source include/wait_until_count_sessions.inc --echo # End of 10.6 tests diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index f7aafbbf9ef..e0c0188ad63 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -16510,6 +16510,7 @@ ha_innobase::store_lock( case ISO_SERIALIZABLE: auto trx_state = trx->state; if (trx_state == TRX_STATE_NOT_STARTED) { + trx->will_lock = true; trx_start_if_not_started(trx, false); trx->read_view.open(trx); } else {