From 18f85c8c681db74b35d3e042a998e4bccb1d6d98 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 24 Jul 2025 00:11:33 +0200 Subject: [PATCH] MDEV-37302 Assertion failure in Table_triggers_list::add_tables_and_routines_for_triggers upon attempt to insert DEFAULT into non-insertable view Only do trigger prelocking for tables that are doing to be modified (with a write lock). A table can cause prelocking if its DEFAULT value is used (because DEFAULT can be NEXTVAL), even if the table itself is only used for reads. Don't process triggers for such a table --- mysql-test/suite/sql_sequence/default.result | 10 ++++++++++ mysql-test/suite/sql_sequence/default.test | 11 +++++++++++ sql/sql_base.cc | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/sql_sequence/default.result b/mysql-test/suite/sql_sequence/default.result index fb8fed00a9a..fe9c6af1795 100644 --- a/mysql-test/suite/sql_sequence/default.result +++ b/mysql-test/suite/sql_sequence/default.result @@ -303,4 +303,14 @@ execute stmt using default; deallocate prepare stmt; drop table t1; drop sequence s1; +# +# MDEV-37302 Assertion failure in Table_triggers_list::add_tables_and_routines_for_triggers upon attempt to insert DEFAULT into non-insertable view +# +create table t1 (f int); +create algorithm=temptable view v1 as select * from t1; +create trigger tr before update on t1 for each row set @a=1; +insert v1 values (default); +ERROR HY000: The target table v1 of the INSERT is not insertable-into +drop view v1; +drop table t1; # End of 10.6 tests diff --git a/mysql-test/suite/sql_sequence/default.test b/mysql-test/suite/sql_sequence/default.test index d7bc978ed9e..5cbfe237cd3 100644 --- a/mysql-test/suite/sql_sequence/default.test +++ b/mysql-test/suite/sql_sequence/default.test @@ -229,4 +229,15 @@ deallocate prepare stmt; drop table t1; drop sequence s1; +--echo # +--echo # MDEV-37302 Assertion failure in Table_triggers_list::add_tables_and_routines_for_triggers upon attempt to insert DEFAULT into non-insertable view +--echo # +create table t1 (f int); +create algorithm=temptable view v1 as select * from t1; +create trigger tr before update on t1 for each row set @a=1; +--error ER_NON_INSERTABLE_TABLE +insert v1 values (default); +drop view v1; +drop table t1; + --echo # End of 10.6 tests diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 1a4fa315c3c..501d13f201c 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4897,7 +4897,7 @@ bool DML_prelocking_strategy::handle_table(THD *thd, DBUG_ASSERT(table_list->lock_type >= TL_FIRST_WRITE || thd->lex->default_used); - if (table_list->trg_event_map) + if (table_list->trg_event_map && table_list->lock_type >= TL_FIRST_WRITE) { if (table->triggers) {