diff options
author | Igor Babaev <igor@askmonty.org> | 2012-06-08 22:15:49 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2012-06-08 22:15:49 -0700 |
commit | 10f42e2c33dff630559299e4151e10a84ce39fd8 (patch) | |
tree | c201a24f62b2e2dbfa1114d9d1eee76477d61d8a | |
parent | ca5473f1db6dc63baffc736737e54bdffd6449a6 (diff) | |
download | mariadb-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.result | 17 | ||||
-rw-r--r-- | mysql-test/t/union.test | 20 | ||||
-rw-r--r-- | sql/sql_parse.cc | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 | ||||
-rw-r--r-- | sql/table.h | 2 |
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; |