diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 15:28:41 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 15:28:41 +0300 |
commit | cef2b34f25b45198868be0c06e00a74a1c1ad062 (patch) | |
tree | 898e71bf440d55ae3c9eb1b2da05fbe41e28dc62 | |
parent | db32d9457edbcb23b45f433cfcdfc5d86232bbb0 (diff) | |
download | mariadb-git-cef2b34f25b45198868be0c06e00a74a1c1ad062.tar.gz |
MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
Wrong assertion condition. SYSTEM_TIME_ALL indicates that
vers_setup_conds() is done. In case FOR SYSTEM_TIME ALL is specified
in command the assertion passes but not checks anything.
-rw-r--r-- | mysql-test/suite/versioning/r/delete.result | 14 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/delete.test | 15 | ||||
-rw-r--r-- | sql/sql_delete.cc | 2 | ||||
-rw-r--r-- | sql/sql_update.cc | 2 | ||||
-rw-r--r-- | sql/table.h | 4 |
5 files changed, 35 insertions, 2 deletions
diff --git a/mysql-test/suite/versioning/r/delete.result b/mysql-test/suite/versioning/r/delete.result index 26ade83acd7..5aa239b9cb8 100644 --- a/mysql-test/suite/versioning/r/delete.result +++ b/mysql-test/suite/versioning/r/delete.result @@ -116,3 +116,17 @@ x 2 1 drop table t1; +# +# MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED +# +create or replace table t1 (a int) with system versioning; +replace into t1 values (1), (2); +create or replace trigger tr before delete on t1 for each row delete from xx; +create or replace procedure pr() delete from t1; +call pr; +ERROR 42S02: Table 'test.xx' doesn't exist +call pr; +ERROR 42S02: Table 'test.xx' doesn't exist +drop procedure pr; +drop trigger tr; +drop table t1; diff --git a/mysql-test/suite/versioning/t/delete.test b/mysql-test/suite/versioning/t/delete.test index 4f1ba4b1d8e..492463f9395 100644 --- a/mysql-test/suite/versioning/t/delete.test +++ b/mysql-test/suite/versioning/t/delete.test @@ -79,4 +79,19 @@ delete from t1; select x from t1 for system_time all; drop table t1; +--echo # +--echo # MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED +--echo # +create or replace table t1 (a int) with system versioning; +replace into t1 values (1), (2); +create or replace trigger tr before delete on t1 for each row delete from xx; +create or replace procedure pr() delete from t1; +--error ER_NO_SUCH_TABLE +call pr; +--error ER_NO_SUCH_TABLE +call pr; +drop procedure pr; +drop trigger tr; +drop table t1; + --source suite/versioning/common_finish.inc diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 78bccd7a506..929455977e6 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -919,7 +919,7 @@ int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, DBUG_ASSERT(table_list->table); // conds could be cached from previous SP call - DBUG_ASSERT(!table_list->vers_conditions.is_set() || + DBUG_ASSERT(!table_list->vers_conditions.need_setup() || !*conds || thd->stmt_arena->is_stmt_execute()); if (select_lex->vers_setup_conds(thd, table_list)) DBUG_RETURN(TRUE); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index d3b771acdad..10b62af3d6f 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -1266,7 +1266,7 @@ bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list, DBUG_ASSERT(table_list->table); // conds could be cached from previous SP call - DBUG_ASSERT(!table_list->vers_conditions.is_set() || + DBUG_ASSERT(!table_list->vers_conditions.need_setup() || !*conds || thd->stmt_arena->is_stmt_execute()); if (select_lex->vers_setup_conds(thd, table_list)) DBUG_RETURN(TRUE); diff --git a/sql/table.h b/sql/table.h index 11ede736127..6214f38585a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1912,6 +1912,10 @@ struct vers_select_conds_t { return orig_type != SYSTEM_TIME_UNSPECIFIED; } + bool need_setup() const + { + return type != SYSTEM_TIME_UNSPECIFIED && type != SYSTEM_TIME_ALL; + } bool resolve_units(THD *thd); bool eq(const vers_select_conds_t &conds) const; }; |