summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2019-12-04 15:01:54 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2019-12-04 15:01:54 +0100
commit81bf7d3317217f9aefb409deb0bff7169b3fe8a3 (patch)
treea2e119c09327d529b81ffe0fcd8b43a3befa32e5
parent8a46b706aab428998e0a3d0315c7c3d67752fddc (diff)
parentbf2f391664c56334ff9229e448bb3efa166c40b7 (diff)
downloadmariadb-git-81bf7d3317217f9aefb409deb0bff7169b3fe8a3.tar.gz
Merge branch 'bb-10.3-release' into 10.3
-rw-r--r--mysql-test/suite/versioning/r/delete.result14
-rw-r--r--mysql-test/suite/versioning/r/update.result4
-rw-r--r--mysql-test/suite/versioning/t/delete.test15
-rw-r--r--mysql-test/suite/versioning/t/update.test5
-rw-r--r--sql/sql_delete.cc2
-rw-r--r--sql/sql_derived.cc3
-rw-r--r--sql/sql_update.cc2
-rw-r--r--sql/table.h4
8 files changed, 46 insertions, 3 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/r/update.result b/mysql-test/suite/versioning/r/update.result
index 64aa7c7068c..94f6f8fa998 100644
--- a/mysql-test/suite/versioning/r/update.result
+++ b/mysql-test/suite/versioning/r/update.result
@@ -295,5 +295,9 @@ primary key (pk)
create or replace view v1 as select * from t1;
insert into t1 values (1, null, 'd') , (2, null, 'i') ;
update v1 set a= null where b = '';
+create or replace table t1 (id int, k int, primary key (id)) engine=innodb with system versioning;
+insert into t1 values (1,1),(2,2);
+create or replace view v1 as select * from t1;
+update v1 set id= 2 where k = 0;
drop view v1;
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/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test
index baf3c1ec876..0af3c450ce5 100644
--- a/mysql-test/suite/versioning/t/update.test
+++ b/mysql-test/suite/versioning/t/update.test
@@ -214,6 +214,11 @@ create or replace view v1 as select * from t1;
insert into t1 values (1, null, 'd') , (2, null, 'i') ;
update v1 set a= null where b = '';
+create or replace table t1 (id int, k int, primary key (id)) engine=innodb with system versioning;
+insert into t1 values (1,1),(2,2);
+create or replace view v1 as select * from t1;
+update v1 set id= 2 where k = 0;
+
# cleanup
drop view v1;
drop table t1;
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_derived.cc b/sql/sql_derived.cc
index 652353fb722..9d6748937ad 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -707,8 +707,9 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
case SQLCOM_DELETE_MULTI:
case SQLCOM_UPDATE:
case SQLCOM_UPDATE_MULTI:
- if ((res= unit->prepare(derived, derived->derived_result, 0)))
+ if ((res= unit->first_select()->vers_setup_conds(thd, derived->merge_underlying_list)))
goto exit;
+ derived->where= and_items(thd, derived->where, derived->merge_underlying_list->where);
default:
break;
}
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 8086e116aa8..a1e7db36ced 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;
};