summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2012-06-13 16:28:47 -0700
committerIgor Babaev <igor@askmonty.org>2012-06-13 16:28:47 -0700
commit28b4aba40a65006af33cc8e1464ab28643442309 (patch)
tree271a685eb80ad0c294f3f4b9c764d5f3773bb758
parentb14d3adad9d10a8575bebca7e7af0ff7ef9f71b1 (diff)
parent10f42e2c33dff630559299e4151e10a84ce39fd8 (diff)
downloadmariadb-git-28b4aba40a65006af33cc8e1464ab28643442309.tar.gz
Merge.
-rw-r--r--mysql-test/r/union.result17
-rw-r--r--mysql-test/t/union.test20
-rw-r--r--sql/sql_parse.cc1
-rw-r--r--sql/sql_yacc.yy4
-rw-r--r--sql/table.h2
5 files changed, 43 insertions, 1 deletions
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 1ac688787c6..75255d558c4 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -1845,3 +1845,20 @@ dev
SELECT(SELECT 1 AS a FROM dual ORDER BY a DESC LIMIT 1) AS dev;
dev
1
+#
+# LP bug#1010729: Unexpected syntax error from UNION
+# (bug #54382) with single-table join nest
+#
+CREATE TABLE t1 (a int);
+CREATE TABLE t2 (b int);
+CREATE TABLE t3 (c int);
+SELECT a FROM t1 UNION SELECT b FROM t2 JOIN (t3) ON ( t2.b = t3.c );
+a
+DROP TABLE t1, t2, t3;
+CREATE TABLE t1 (pk int NOT NULL);
+CREATE TABLE t2 (pk int NOT NULL, fk int NOT NULL);
+SELECT t1.pk FROM t1 LEFT JOIN (t2) ON (t1.pk = t2.fk)
+UNION
+SELECT t1.pk FROM t1 LEFT JOIN (t2) ON (t1.pk = t2.fk);
+pk
+DROP TABLE t1,t2;
diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test
index 9c03f93028c..94860ceec2d 100644
--- a/mysql-test/t/union.test
+++ b/mysql-test/t/union.test
@@ -1237,3 +1237,23 @@ SELECT(SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a DESC LIM
SELECT(SELECT 1 AS a ORDER BY a) AS dev;
SELECT(SELECT 1 AS a LIMIT 1) AS dev;
SELECT(SELECT 1 AS a FROM dual ORDER BY a DESC LIMIT 1) AS dev;
+
+--echo #
+--echo # LP bug#1010729: Unexpected syntax error from UNION
+--echo # (bug #54382) with single-table join nest
+--echo #
+CREATE TABLE t1 (a int);
+CREATE TABLE t2 (b int);
+CREATE TABLE t3 (c int);
+SELECT a FROM t1 UNION SELECT b FROM t2 JOIN (t3) ON ( t2.b = t3.c );
+
+DROP TABLE t1, t2, t3;
+
+CREATE TABLE t1 (pk int NOT NULL);
+CREATE TABLE t2 (pk int NOT NULL, fk int NOT NULL);
+SELECT t1.pk FROM t1 LEFT JOIN (t2) ON (t1.pk = t2.fk)
+UNION
+SELECT t1.pk FROM t1 LEFT JOIN (t2) ON (t1.pk = t2.fk);
+
+DROP TABLE t1,t2;
+
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 70258629197..4ee458c9806 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -6192,6 +6192,7 @@ TABLE_LIST *st_select_lex::end_nested_join(THD *thd)
embedded->embedding= embedding;
join_list->push_front(embedded);
ptr= embedded;
+ embedded->lifted= 1;
}
else if (nested_join->join_list.elements == 0)
{
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index e968dd12ca0..4e3629080be 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9823,7 +9823,9 @@ table_factor:
lex->nest_level--;
}
else if (($3->select_lex &&
- $3->select_lex->master_unit()->is_union()) || $5)
+ $3->select_lex->master_unit()->is_union() &&
+ ($3->select_lex->master_unit()->first_select() ==
+ $3->select_lex || !$3->lifted)) || $5)
{
/* simple nested joins cannot have aliases or unions */
my_parse_error(ER(ER_SYNTAX_ERROR));
diff --git a/sql/table.h b/sql/table.h
index f3f9d5ac036..87affe984fc 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -1800,6 +1800,8 @@ struct TABLE_LIST
struct st_nested_join *nested_join; /* if the element is a nested join */
TABLE_LIST *embedding; /* nested join containing the table */
List<TABLE_LIST> *join_list;/* join list the table belongs to */
+ bool lifted; /* set to true when the table is moved to
+ the upper level at the parsing stage */
bool cacheable_table; /* stop PS caching */
/* used in multi-upd/views privilege check */
bool table_in_first_from_clause;