Skip to content

Commit cafbfb4

Browse files
author
Martin Hansson
committed
The previous change actually destroyed the part of subquery
syntax that worked. A union without parentheses was actually working. Now we're making the whole thing work. This introduces an ambiguity, though, so we fix that with a %prec declaration.
1 parent d5e68fd commit cafbfb4

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/parser/bison_parser.y

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@
319319
/* Unary Operators */
320320
%right UMINUS
321321
%left '[' ']'
322+
%left SUBQUERY_AS_EXPR
322323
%left '(' ')'
323324
%left '.'
324325
%left JOIN
@@ -905,9 +906,9 @@ query_expression_parens : '(' query_expression_parens ')' { $$ = $2; }
905906

906907
query_term : query_primary;
907908

908-
subquery : '(' query_expression ')' { $$ = $2; };
909+
subquery : query_expression_parens % prec SUBQUERY_AS_EXPR
909910

910-
set_operator : set_type opt_all {
911+
set_operator : set_type opt_all {
911912
$$ = $1;
912913
$$->isAll = $2;
913914
};
@@ -1044,8 +1045,8 @@ expr : operand | between_expr | logic_expr | exists_expr | in_expr;
10441045

10451046
operand : '(' expr ')' { $$ = $2; }
10461047
| array_index | scalar_expr | unary_expr | binary_expr | case_expr | function_expr | extract_expr | cast_expr |
1047-
array_expr | '(' query_primary ')' {
1048-
$$ = Expr::makeSelect($2);
1048+
array_expr | subquery {
1049+
$$ = Expr::makeSelect($1);
10491050
};
10501051

10511052
scalar_expr : column_name | literal;

test/queries/queries-good.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ SELECT * FROM t WHERE a = ? AND b = ?;
1818
SELECT City.name, Product.category, SUM(price) FROM fact INNER JOIN City ON fact.city_id = City.id INNER JOIN Product ON fact.product_id = Product.id GROUP BY City.name, Product.category;
1919
SELECT SUBSTR(a, 3, 5) FROM t;
2020
SELECT * FROM t WHERE a = DATE '1996-12-31';
21+
# Top-level union syntax
2122
SELECT 1 UNION SELECT 1;
2223
(SELECT 1 UNION SELECT 1);
2324
((SELECT 1 UNION SELECT 1));
@@ -46,6 +47,16 @@ SELECT 1 UNION ((SELECT 1));
4647
((SELECT 1)) UNION ((SELECT 1));
4748
(((SELECT 1)) UNION ((SELECT 1)));
4849
((((SELECT 1)) UNION ((SELECT 1))));
50+
# Union in scalar subquery syntax
51+
SELECT (SELECT 1 UNION SELECT 1);
52+
SELECT ((SELECT 1) UNION SELECT 1);
53+
SELECT (((SELECT 1)) UNION SELECT 1);
54+
SELECT (SELECT 1 UNION (SELECT 1));
55+
SELECT (SELECT 1 UNION ((SELECT 1)));
56+
SELECT ((SELECT 1 UNION ((SELECT 1))));
57+
SELECT ((SELECT 1) UNION (SELECT 1));
58+
SELECT (((SELECT 1) UNION (SELECT 1)));
59+
SELECT ((((SELECT 1)) UNION ((SELECT 1))));
4960
# JOIN
5061
SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5
5162
SELECT * FROM t1 JOIN t2 ON c1 = c2;

0 commit comments

Comments
 (0)