summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2012-06-08 22:15:49 -0700
committerIgor Babaev <igor@askmonty.org>2012-06-08 22:15:49 -0700
commit10f42e2c33dff630559299e4151e10a84ce39fd8 (patch)
treec201a24f62b2e2dbfa1114d9d1eee76477d61d8a
parentca5473f1db6dc63baffc736737e54bdffd6449a6 (diff)
downloadmariadb-git-10f42e2c33dff630559299e4151e10a84ce39fd8.tar.gz
Fixed LP bug #1010729.
The bug prevented acceptance of UNION queries whose non-first select clauses contained join expressions with degenerated single-table nests as valid queries. The bug was introduced into mysql-5.5 code line by the patch for bug 33204.
-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 34e015e1f9b..6b580f2450c 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;