mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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.
This commit is contained in:
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user