diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-02 12:51:53 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-02 12:51:53 +0300 |
commit | 0b8b11b0b15f2d3d20dc801e50fa2beedc080dad (patch) | |
tree | 7a7b9f8ec419bff57b3b0258293d91f180908037 /sql/sql_derived.cc | |
parent | 1d46923a0f6508d52d7ce679a7dd8e7e0e957ae4 (diff) | |
parent | db32d9457edbcb23b45f433cfcdfc5d86232bbb0 (diff) | |
download | mariadb-git-0b8b11b0b15f2d3d20dc801e50fa2beedc080dad.tar.gz |
Merge 10.3 into 10.4
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r-- | sql/sql_derived.cc | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 06a3e8a108f..3f955c16eb3 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -726,12 +726,27 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) { /* System versioned tables may still require to get versioning conditions - (when updating view). See vers_setup_conds(). + when modifying view (see vers_setup_conds()). Only UPDATE and DELETE are + affected because they use WHERE condition. */ if (!unit->prepared && derived->table->versioned() && - (res= unit->prepare(derived, derived->derived_result, 0))) - goto exit; + derived->merge_underlying_list && + /* choose only those merged views that do not select from other views */ + !derived->merge_underlying_list->merge_underlying_list) + { + switch (thd->lex->sql_command) + { + case SQLCOM_DELETE: + case SQLCOM_DELETE_MULTI: + case SQLCOM_UPDATE: + case SQLCOM_UPDATE_MULTI: + if ((res= unit->prepare(derived, derived->derived_result, 0))) + goto exit; + default: + break; + } + } DBUG_RETURN(FALSE); } @@ -881,7 +896,7 @@ exit: { if (!derived->is_with_table_recursive_reference()) { - if (derived->table) + if (derived->table && derived->table->s->tmp_table) free_tmp_table(thd, derived->table); delete derived->derived_result; } |