summaryrefslogtreecommitdiff
path: root/sql/sql_derived.cc
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2019-12-02 13:35:54 +0300
committerAleksey Midenkov <midenok@gmail.com>2019-12-02 13:35:54 +0300
commit8ed646f0712b8f459439dfcdc3cf4ae45d79ec95 (patch)
tree4f1c760e447fde08e9f68253fd1c353f58832917 /sql/sql_derived.cc
parent523879dd51c3bf2ad23295852304531d856cc869 (diff)
parent0b8b11b0b15f2d3d20dc801e50fa2beedc080dad (diff)
downloadmariadb-git-8ed646f0712b8f459439dfcdc3cf4ae45d79ec95.tar.gz
Merge 10.4 into 10.5
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r--sql/sql_derived.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 09f8acc536c..fc6bf44bbb1 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;
}