diff options
author | unknown <sanja@askmonty.org> | 2013-06-06 23:33:40 +0300 |
---|---|---|
committer | unknown <sanja@askmonty.org> | 2013-06-06 23:33:40 +0300 |
commit | ad947563ac9e42090cbcaef00ce0d22708d19f12 (patch) | |
tree | 0c8e2f385eda315630ab6d0e31563104883907f7 | |
parent | fce7fc43ba165cd704889c9d35f92e15288f5730 (diff) | |
download | mariadb-git-ad947563ac9e42090cbcaef00ce0d22708d19f12.tar.gz |
MDEV-4593: p_s: crash in simplify_joins with delete using subselect from view
mysql_derived_merge_for_insert() should not be called for views or derived tables which are not put (directly or via other views) in main SELECT_LEX "join list".
-rw-r--r-- | mysql-test/r/view.result | 12 | ||||
-rw-r--r-- | mysql-test/t/view.test | 14 | ||||
-rw-r--r-- | sql/sql_derived.cc | 11 |
3 files changed, 36 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index ee6c235d09e..0f666f0e708 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -4651,6 +4651,18 @@ a 1 drop view v1; drop table t1,t2; +# +# MDEV-4593: p_s: crash in simplify_joins with delete using subselect +# from view +# +create table `t1`(`a` int); +create table `t2`(`a` int); +create or replace view `v1` as select `a` from `t1`; +prepare s from "delete from `t2` order by (select 1 from `v1`)"; +execute s; +deallocate prepare s; +drop view v1; +drop tables t1,t2; # ----------------------------------------------------------------- # -- End of 5.3 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 2a230e65493..f3f8dbfe77f 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -4596,6 +4596,20 @@ WHERE a = alias.a ); drop view v1; drop table t1,t2; +--echo # +--echo # MDEV-4593: p_s: crash in simplify_joins with delete using subselect +--echo # from view +--echo # + +create table `t1`(`a` int); +create table `t2`(`a` int); +create or replace view `v1` as select `a` from `t1`; +prepare s from "delete from `t2` order by (select 1 from `v1`)"; +execute s; +deallocate prepare s; +drop view v1; +drop tables t1,t2; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.3 tests. --echo # ----------------------------------------------------------------- diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 99d20090623..afc2dea359a 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -83,7 +83,16 @@ mysql_handle_derived(LEX *lex, uint phases) sl && !res; sl= sl->next_select_in_list()) { - for (TABLE_LIST *cursor= sl->get_table_list(); + TABLE_LIST *cursor= sl->get_table_list(); + /* + DT_MERGE_FOR_INSERT is not needed for views/derived tables inside + subqueries. Views and derived tables of subqueries should be + processed normally. + */ + if (phases == DT_MERGE_FOR_INSERT && + cursor && cursor->top_table()->select_lex != &lex->select_lex) + continue; + for (; cursor && !res; cursor= cursor->next_local) { |