diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 15:46:49 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-03 15:46:49 +0300 |
commit | bf2f391664c56334ff9229e448bb3efa166c40b7 (patch) | |
tree | bf6abe329c9cbd904d24ce209945551152af8f72 | |
parent | cef2b34f25b45198868be0c06e00a74a1c1ad062 (diff) | |
download | mariadb-git-bf2f391664c56334ff9229e448bb3efa166c40b7.tar.gz |
MDEV-21147 Assertion `marked_for_read()' upon UPDATE on versioned table via view
Unit prepare prematurely fixed field which must be fixed via
setup_conds() to correctly update table->covering_keys.
Call vers_setup_conds() directly instead, because actually everything
else is not needed.
-rw-r--r-- | mysql-test/suite/versioning/r/update.result | 4 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/update.test | 5 | ||||
-rw-r--r-- | sql/sql_derived.cc | 3 |
3 files changed, 11 insertions, 1 deletions
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/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_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; } |