summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sanja@askmonty.org>2013-06-06 23:33:40 +0300
committerunknown <sanja@askmonty.org>2013-06-06 23:33:40 +0300
commitad947563ac9e42090cbcaef00ce0d22708d19f12 (patch)
tree0c8e2f385eda315630ab6d0e31563104883907f7
parentfce7fc43ba165cd704889c9d35f92e15288f5730 (diff)
downloadmariadb-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.result12
-rw-r--r--mysql-test/t/view.test14
-rw-r--r--sql/sql_derived.cc11
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)
{