Add select subexpressions

pull/315/head
Maksim Novikov 2021-06-19 18:19:43 +07:00
parent 9be3c470f1
commit 3bbf6df064
No known key found for this signature in database
GPG Key ID: 2F1C320B72DA6C55
7 changed files with 4917 additions and 4434 deletions

@ -2,4 +2,8 @@
SELECT foo, bar, t.col1 AS baz
FROM table1, table2 AS t
WHERE foo > t.col1
GROUP BY lower(foo)
GROUP BY lower(foo);
-- Example nested select query
SELECT t.a, (SELECT 1) AS baz, (SELECT 2)
FROM table1, (SELECT a FROM foo WHERE b > 100) AS t;

@ -194,6 +194,7 @@ module.exports = grammar({
prec.left(seq(caseInsensitive("SELECT"), optional($.select_clause_body))),
from_clause: $ =>
seq(caseInsensitive("FROM"), commaSep1($._aliasable_expression)),
select_subexpression: $ => seq("(", $.select_statement, ")"),
in_expression: $ =>
prec.left(
1,
@ -341,6 +342,7 @@ module.exports = grammar({
$.type_cast,
$.binary_expression,
$.argument_reference,
$.select_subexpression,
),
},
});

21
src/grammar.json vendored

@ -1369,6 +1369,23 @@
}
]
},
"select_subexpression": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SYMBOL",
"name": "select_statement"
},
{
"type": "STRING",
"value": ")"
}
]
},
"in_expression": {
"type": "PREC_LEFT",
"value": 1,
@ -2399,6 +2416,10 @@
{
"type": "SYMBOL",
"name": "argument_reference"
},
{
"type": "SYMBOL",
"name": "select_subexpression"
}
]
}

@ -74,6 +74,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -169,6 +173,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -240,6 +248,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -311,6 +323,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -382,6 +398,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -453,6 +473,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -555,6 +579,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -954,6 +982,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1025,6 +1057,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1138,6 +1174,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1236,6 +1276,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1333,6 +1377,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1404,6 +1452,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1483,6 +1535,10 @@
"type": "ordered_expression",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1558,6 +1614,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1732,6 +1792,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1818,6 +1882,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -1989,6 +2057,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -2031,6 +2103,21 @@
]
}
},
{
"type": "select_subexpression",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "select_statement",
"named": true
}
]
}
},
{
"type": "setof",
"named": true,
@ -2166,6 +2253,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -2242,6 +2333,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true
@ -2353,6 +2448,10 @@
"type": "number",
"named": true
},
{
"type": "select_subexpression",
"named": true
},
{
"type": "string",
"named": true

9196
src/parser.c vendored

File diff suppressed because it is too large Load Diff

@ -35,6 +35,21 @@ SELECT a, b FROM table1;
(select_clause (select_clause_body (identifier) (identifier)))
(from_clause (identifier))))
================
SELECT statement with SELECT subexpression
================
SELECT (SELECT 1) AS a
---
(source_file
(select_statement
(select_clause (select_clause_body (alias
(select_subexpression
(select_statement (select_clause (select_clause_body (number)))))
(identifier))))))
================
SELECT statement with aliases
================

@ -27,6 +27,16 @@ where a = b
group by a, b
-- <- keyword
-- ^ keyword
order by lower(a), b
order by lower(a), b;
-- <- keyword
-- ^ keyword
SELECT (SELECT 1), a
-- <- keyword
-- ^ keyword
-- ^ number
FROM (SELECT a FROM table) AS b;
-- <- keyword
-- ^ keyword
-- ^ keyword
-- ^ keyword