Skip to content

Commit fd1369a

Browse files
committed
MDEV-39542 Assertion failed in trx_flush_log_if_needed()
trx_flush_log_if_needed(): Correct a debug assertion.
1 parent db6ee89 commit fd1369a

3 files changed

Lines changed: 58 additions & 1 deletion

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#
2+
# MDEV-39542 Assertion failed in trx_flush_log_if_needed()
3+
#
4+
CREATE TABLE t (id INT) ENGINE=InnoDB;
5+
INSERT INTO t VALUES (1),(2),(3);
6+
CREATE FUNCTION f(i INT) RETURNS INT
7+
BEGIN
8+
SET TRANSACTION READ ONLY;
9+
RETURN i;
10+
END //
11+
CREATE FUNCTION g(i INT) RETURNS INT
12+
BEGIN
13+
START TRANSACTION READ ONLY;
14+
RETURN i;
15+
END //
16+
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger
17+
DELETE FROM t WHERE id=f(1);
18+
DELETE FROM t WHERE id=2;
19+
SET TRANSACTION READ ONLY;
20+
DELETE FROM t WHERE id=3;
21+
ERROR 25006: Cannot execute statement in a READ ONLY transaction
22+
SELECT * FROM t;
23+
id
24+
3
25+
DROP FUNCTION f;
26+
DROP TABLE t;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--source include/have_innodb.inc
2+
3+
--echo #
4+
--echo # MDEV-39542 Assertion failed in trx_flush_log_if_needed()
5+
--echo #
6+
CREATE TABLE t (id INT) ENGINE=InnoDB;
7+
INSERT INTO t VALUES (1),(2),(3);
8+
--delimiter //
9+
CREATE FUNCTION f(i INT) RETURNS INT
10+
BEGIN
11+
SET TRANSACTION READ ONLY;
12+
RETURN i;
13+
END //
14+
15+
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
16+
CREATE FUNCTION g(i INT) RETURNS INT
17+
BEGIN
18+
START TRANSACTION READ ONLY;
19+
RETURN i;
20+
END //
21+
22+
--delimiter ;
23+
DELETE FROM t WHERE id=f(1);
24+
# MDEV-39649 FIXME: The SET TRANSACTION READ ONLY in f(1) was ignored!
25+
DELETE FROM t WHERE id=2;
26+
SET TRANSACTION READ ONLY;
27+
--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION
28+
DELETE FROM t WHERE id=3;
29+
SELECT * FROM t;
30+
DROP FUNCTION f;
31+
DROP TABLE t;

storage/innobase/trx/trx0trx.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1257,7 +1257,7 @@ static void trx_flush_log_if_needed(lsn_t lsn, trx_t *trx)
12571257
if (log_sys.get_flushed_lsn(std::memory_order_relaxed) >= lsn)
12581258
return;
12591259

1260-
ut_ad(!trx->mysql_thd || !trx->mysql_thd->tx_read_only);
1260+
ut_ad(!trx->read_only);
12611261

12621262
const bool flush=
12631263
(srv_file_flush_method != SRV_NOSYNC &&

0 commit comments

Comments
 (0)