Add group by

pull/315/head
Maksim Novikov 2021-06-05 12:08:24 +07:00
parent ee2559aed7
commit 0461e0a9ef
No known key found for this signature in database
GPG Key ID: 2F1C320B72DA6C55
7 changed files with 4505 additions and 4006 deletions

@ -1,3 +1,5 @@
-- Example select query
SELECT foo, bar, t.col1 AS baz
FROM table1, table2 AS t
WHERE foo != t.col1
WHERE foo > t.col1
GROUP BY lower(foo)

@ -169,8 +169,11 @@ module.exports = grammar({
caseInsensitive("SELECT"),
optional($.select_clause),
optional($.from_clause),
optional($.where_clause)
optional($.where_clause),
optional($.group_by_clause)
),
group_by_clause: ($) =>
seq(caseInsensitive("GROUP BY"), commaSep1($._expression)),
where_clause: ($) => seq(caseInsensitive("WHERE"), $._expression),
_aliased_expression: ($) =>
seq($._expression, caseInsensitive("AS"), $.identifier),

@ -1,6 +1,10 @@
(identifier) @variable
; (identifier) @variable FIXME this overrides function call pattern
(string) @string
(number) @number
(comment) @comment
(function_call
function: (identifier) @function)
[
(NULL)
@ -41,4 +45,6 @@
"SELECT"
"WHERE"
"FROM"
"AS"
"GROUP BY"
] @keyword

51
src/grammar.json vendored

@ -1067,6 +1067,57 @@
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "group_by_clause"
},
{
"type": "BLANK"
}
]
}
]
},
"group_by_clause": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "PATTERN",
"value": "[gG][rR][oO][uU][pP][ ][bB][yY]"
},
"named": false,
"value": "GROUP BY"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
}
]
}
]
},

@ -1199,6 +1199,73 @@
}
}
},
{
"type": "group_by_clause",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "FALSE",
"named": true
},
{
"type": "NULL",
"named": true
},
{
"type": "TRUE",
"named": true
},
{
"type": "binary_expression",
"named": true
},
{
"type": "boolean_expression",
"named": true
},
{
"type": "comparison_operator",
"named": true
},
{
"type": "field_access",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "in_expression",
"named": true
},
{
"type": "is_expression",
"named": true
},
{
"type": "number",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "type_cast",
"named": true
}
]
}
},
{
"type": "in_expression",
"named": true,
@ -1741,6 +1808,10 @@
"type": "from_clause",
"named": true
},
{
"type": "group_by_clause",
"named": true
},
{
"type": "select_clause",
"named": true
@ -2201,6 +2272,10 @@
"type": "FROM",
"named": false
},
{
"type": "GROUP BY",
"named": false
},
{
"type": "IMMUTABLE",
"named": false

8352
src/parser.c vendored

File diff suppressed because it is too large Load Diff

@ -47,6 +47,22 @@ SELECT a, b AS c FROM table1 AS t;
(select_clause (identifier) (alias (identifier) (identifier)))
(from_clause (alias (identifier) (identifier)))))
================
SELECT statement with group by
================
SELECT a, b
FROM table1
GROUP BY lower(a), b;
---
(source_file
(select_statement
(select_clause (identifier) (identifier))
(from_clause (identifier))
(group_by_clause (function_call (identifier) (identifier)) (identifier))))
================
SELECT statement FROM multiple tables
================