diff --git a/package.json b/package.json index 8c3ce619..adb2cfc7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "sql-parser-cst", "description": "Parses SQL into Concrete Syntax Tree (CST)", "license": "GPL-2.0-or-later", - "version": "0.31.1", + "version": "0.32.0", "main": "lib/main.js", "types": "lib/main.d.ts", "repository": { diff --git a/src/cst/Select.ts b/src/cst/Select.ts index 513021a6..14d579ec 100644 --- a/src/cst/Select.ts +++ b/src/cst/Select.ts @@ -44,6 +44,7 @@ export type AllSelectNodes = | GroupByRollup | GroupByCube | GroupByGroupingSets + | GroupByAll | HavingClause | WindowClause | QualifyClause @@ -276,7 +277,12 @@ export interface GroupByClause extends BaseNode { withRollupKw?: [Keyword<"WITH">, Keyword<"ROLLUP">]; // MySQL, MariaDB } -type GroupingElement = Expr | GroupByRollup | GroupByCube | GroupByGroupingSets; +type GroupingElement = + | Expr + | GroupByRollup + | GroupByCube + | GroupByGroupingSets + | GroupByAll; // BigQuery, PostgreSQL export interface GroupByRollup extends BaseNode { @@ -292,6 +298,12 @@ export interface GroupByCube extends BaseNode { columns: ParenExpr>; } +// BigQuery +export interface GroupByAll extends BaseNode { + type: "group_by_all"; + allKw: Keyword<"ALL">; +} + // PostgreSQL export interface GroupByGroupingSets extends BaseNode { type: "group_by_grouping_sets"; diff --git a/src/parser.pegjs b/src/parser.pegjs index fc6e5928..9858b085 100644 --- a/src/parser.pegjs +++ b/src/parser.pegjs @@ -913,6 +913,7 @@ grouping_element = group_by_rollup / group_by_cube / group_by_grouping_sets + / group_by_all &bigquery / paren$empty_list / expr @@ -943,6 +944,14 @@ group_by_grouping_sets }); } +group_by_all + = kw:ALL { + return loc({ + type: "group_by_all", + allKw: read(kw), + }); + } + /** * SELECT .. HAVING * -------------------------------------------------------------------------------------- diff --git a/src/showNode/select.ts b/src/showNode/select.ts index 55333d8d..9e962a57 100644 --- a/src/showNode/select.ts +++ b/src/showNode/select.ts @@ -104,6 +104,7 @@ export const selectMap: FullTransformMap = { group_by_rollup: (node) => show([node.rollupKw, node.columns]), group_by_cube: (node) => show([node.cubeKw, node.columns]), group_by_grouping_sets: (node) => show([node.groupingSetsKw, node.columns]), + group_by_all: (node) => show([node.allKw]), having_clause: (node) => show([node.havingKw, node.expr]), qualify_clause: (node) => show([node.qualifyKw, node.expr]), order_by_clause: (node) => diff --git a/test/select/group_by.test.ts b/test/select/group_by.test.ts index 3c1fe528..c57a4226 100644 --- a/test/select/group_by.test.ts +++ b/test/select/group_by.test.ts @@ -20,6 +20,12 @@ describe("select GROUP BY", () => { }); }); + dialect(["bigquery"], () => { + it("supports GROUP BY ALL", () => { + testClauseWc("GROUP BY ALL"); + }); + }); + dialect(["bigquery", "postgresql"], () => { it("supports GROUP BY ROLLUP()", () => { testClauseWc("GROUP BY ROLLUP ( id, name + age )");