summaryrefslogtreecommitdiff
path: root/sql/sql_derived.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2021-04-19 19:52:06 -0700
committerIgor Babaev <igor@askmonty.org>2021-04-22 13:56:50 -0700
commitb3b5d57e78f835473d13d383caacb7320b5938d5 (patch)
tree944f0e6eb27dbbd781d8f27618e4dce10986256c /sql/sql_derived.cc
parent5c5d24c772d4596b0c28f2267477afe448d6e7f7 (diff)
downloadmariadb-git-b3b5d57e78f835473d13d383caacb7320b5938d5.tar.gz
MDEV-24823 Crash with invalid multi-table update of view in 2nd execution of SP
Before this patch mergeable derived tables / view used in a multi-table update / delete were merged before the preparation stage. When the merge of a derived table / view is performed the on expression attached to it is fixed and ANDed with the where condition of the select S containing this derived table / view. It happens after the specification of the derived table / view has been merged into S. If the ON expression refers to a non existing field an error is reported and some other mergeable derived tables / views remain unmerged. It's not a problem if the multi-table update / delete statement is standalone. Yet if it is used in a stored procedure the select with incompletely merged derived tables / views may cause a problem for the second call of the procedure. This does not happen for select queries using derived tables / views, because in this case their specifications are merged after the preparation stage at which all ON expressions are fixed. This patch makes sure that merging of the derived tables / views used in a multi-table update / delete statement is performed after the preparation stage. Approved by Oleksandr Byelkin <sanja@mariadb.com>
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r--sql/sql_derived.cc5
1 files changed, 1 insertions, 4 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 5a85b7ea7e3..5f90f2f9ab0 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -354,10 +354,6 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
DBUG_RETURN(FALSE);
}
- if (thd->lex->sql_command == SQLCOM_UPDATE_MULTI ||
- thd->lex->sql_command == SQLCOM_DELETE_MULTI)
- thd->save_prep_leaf_list= TRUE;
-
arena= thd->activate_stmt_arena_if_needed(&backup); // For easier test
if (!derived->merged_for_insert ||
@@ -435,6 +431,7 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
derived->on_expr= expr;
derived->prep_on_expr= expr->copy_andor_structure(thd);
}
+ thd->where= "on clause";
if (derived->on_expr &&
((!derived->on_expr->fixed &&
derived->on_expr->fix_fields(thd, &derived->on_expr)) ||