Skip to content

Commit 6930605

Browse files
committed
add support of window function in antlr grammar
1 parent 746964a commit 6930605

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

utils/antlr/ClickHouseLexer.g4

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ CONSTRAINT: C O N S T R A I N T;
3535
CREATE: C R E A T E;
3636
CROSS: C R O S S;
3737
CUBE: C U B E;
38+
CURRENT: C U R R E N T;
3839
DATABASE: D A T A B A S E;
3940
DATABASES: D A T A B A S E S;
4041
DATE: D A T E;
@@ -65,6 +66,7 @@ FETCHES: F E T C H E S;
6566
FINAL: F I N A L;
6667
FIRST: F I R S T;
6768
FLUSH: F L U S H;
69+
FOLLOWING: F O L L O W I N G;
6870
FOR: F O R;
6971
FORMAT: F O R M A T;
7072
FREEZE: F R E E Z E;
@@ -125,8 +127,10 @@ OR: O R;
125127
ORDER: O R D E R;
126128
OUTER: O U T E R;
127129
OUTFILE: O U T F I L E;
130+
OVER: O V E R;
128131
PARTITION: P A R T I T I O N;
129132
POPULATE: P O P U L A T E;
133+
PRECEDING: P R E C E D I N G;
130134
PREWHERE: P R E W H E R E;
131135
PRIMARY: P R I M A R Y;
132136
PROJECTION: P R O J E C T I O N;
@@ -140,6 +144,8 @@ REPLICA: R E P L I C A;
140144
REPLICATED: R E P L I C A T E D;
141145
RIGHT: R I G H T;
142146
ROLLUP: R O L L U P;
147+
ROW: R O W;
148+
ROWS: R O W S;
143149
SAMPLE: S A M P L E;
144150
SECOND: S E C O N D;
145151
SELECT: S E L E C T;
@@ -171,6 +177,7 @@ TRIM: T R I M;
171177
TRUNCATE: T R U N C A T E;
172178
TTL: T T L;
173179
TYPE: T Y P E;
180+
UNBOUNDED: U N B O U N D E D;
174181
UNION: U N I O N;
175182
UPDATE: U P D A T E;
176183
USE: U S E;
@@ -183,6 +190,7 @@ WATCH: W A T C H;
183190
WEEK: W E E K;
184191
WHEN: W H E N;
185192
WHERE: W H E R E;
193+
WINDOW: W I N D O W;
186194
WITH: W I T H;
187195
YEAR: Y E A R | Y Y Y Y;
188196

utils/antlr/ClickHouseParser.g4

+27-11
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ selectStmt:
243243
SELECT DISTINCT? topClause? columnExprList
244244
fromClause?
245245
arrayJoinClause?
246+
windowClause?
246247
prewhereClause?
247248
whereClause?
248249
groupByClause? (WITH (CUBE | ROLLUP))? (WITH TOTALS)?
@@ -257,6 +258,7 @@ withClause: WITH columnExprList;
257258
topClause: TOP DECIMAL_LITERAL (WITH TIES)?;
258259
fromClause: FROM joinExpr;
259260
arrayJoinClause: (LEFT | INNER)? ARRAY JOIN columnExprList;
261+
windowClause: WINDOW identifier AS LPAREN windowExpr RPAREN;
260262
prewhereClause: PREWHERE columnExpr;
261263
whereClause: WHERE columnExpr;
262264
groupByClause: GROUP BY ((CUBE | ROLLUP) LPAREN columnExprList RPAREN | columnExprList);
@@ -298,6 +300,18 @@ ratioExpr: numberLiteral (SLASH numberLiteral)?;
298300
settingExprList: settingExpr (COMMA settingExpr)*;
299301
settingExpr: identifier EQ_SINGLE literal;
300302

303+
windowExpr: winPartitionByClause? winOrderByClause? winFrameClause?;
304+
winPartitionByClause: PARTITION BY columnExprList;
305+
winOrderByClause: ORDER BY orderExprList;
306+
winFrameClause: (ROWS | RANGE) winFrameExtend;
307+
winFrameExtend
308+
: winFrameBound # frameStart
309+
| BETWEEN winFrameBound AND winFrameBound # frameBetween
310+
;
311+
winFrameBound: (CURRENT ROW | UNBOUNDED PRECEDING | UNBOUNDED FOLLOWING | numberLiteral PRECEDING | numberLiteral FOLLOWING);
312+
//rangeClause: RANGE LPAREN (MIN identifier MAX identifier | MAX identifier MIN identifier) RPAREN;
313+
314+
301315
// SET statement
302316

303317
setStmt: SET settingExprList;
@@ -364,6 +378,8 @@ columnExpr
364378
| SUBSTRING LPAREN columnExpr FROM columnExpr (FOR columnExpr)? RPAREN # ColumnExprSubstring
365379
| TIMESTAMP STRING_LITERAL # ColumnExprTimestamp
366380
| TRIM LPAREN (BOTH | LEADING | TRAILING) STRING_LITERAL FROM columnExpr RPAREN # ColumnExprTrim
381+
| identifier (LPAREN columnExprList? RPAREN) OVER LPAREN windowExpr RPAREN # ColumnExprWinFunction
382+
| identifier (LPAREN columnExprList? RPAREN) OVER identifier # ColumnExprWinFunctionTarget
367383
| identifier (LPAREN columnExprList? RPAREN)? LPAREN DISTINCT? columnArgList? RPAREN # ColumnExprFunction
368384
| literal # ColumnExprLiteral
369385

@@ -454,17 +470,17 @@ interval: SECOND | MINUTE | HOUR | DAY | WEEK | MONTH | QUARTER | YEAR;
454470
keyword
455471
// except NULL_SQL, INF, NAN_SQL
456472
: AFTER | ALIAS | ALL | ALTER | AND | ANTI | ANY | ARRAY | AS | ASCENDING | ASOF | AST | ASYNC | ATTACH | BETWEEN | BOTH | BY | CASE
457-
| CAST | CHECK | CLEAR | CLUSTER | CODEC | COLLATE | COLUMN | COMMENT | CONSTRAINT | CREATE | CROSS | CUBE | DATABASE | DATABASES
458-
| DATE | DEDUPLICATE | DEFAULT | DELAY | DELETE | DESCRIBE | DESC | DESCENDING | DETACH | DICTIONARIES | DICTIONARY | DISK | DISTINCT
459-
| DISTRIBUTED | DROP | ELSE | END | ENGINE | EVENTS | EXISTS | EXPLAIN | EXPRESSION | EXTRACT | FETCHES | FINAL | FIRST | FLUSH | FOR
460-
| FORMAT | FREEZE | FROM | FULL | FUNCTION | GLOBAL | GRANULARITY | GROUP | HAVING | HIERARCHICAL | ID | IF | ILIKE | IN | INDEX
461-
| INJECTIVE | INNER | INSERT | INTERVAL | INTO | IS | IS_OBJECT_ID | JOIN | JSON_FALSE | JSON_TRUE | KEY | KILL | LAST | LAYOUT
462-
| LEADING | LEFT | LIFETIME | LIKE | LIMIT | LIVE | LOCAL | LOGS | MATERIALIZE | MATERIALIZED | MAX | MERGES | MIN | MODIFY | MOVE
463-
| MUTATION | NO | NOT | NULLS | OFFSET | ON | OPTIMIZE | OR | ORDER | OUTER | OUTFILE | PARTITION | POPULATE | PREWHERE | PRIMARY
464-
| RANGE | RELOAD | REMOVE | RENAME | REPLACE | REPLICA | REPLICATED | RIGHT | ROLLUP | SAMPLE | SELECT | SEMI | SENDS | SET | SETTINGS
465-
| SHOW | SOURCE | START | STOP | SUBSTRING | SYNC | SYNTAX | SYSTEM | TABLE | TABLES | TEMPORARY | TEST | THEN | TIES | TIMEOUT
466-
| TIMESTAMP | TOTALS | TRAILING | TRIM | TRUNCATE | TO | TOP | TTL | TYPE | UNION | UPDATE | USE | USING | UUID | VALUES | VIEW
467-
| VOLUME | WATCH | WHEN | WHERE | WITH
473+
| CAST | CHECK | CLEAR | CLUSTER | CODEC | COLLATE | COLUMN | COMMENT | CONSTRAINT | CREATE | CROSS | CUBE | CURRENT | DATABASE
474+
| DATABASES | DATE | DEDUPLICATE | DEFAULT | DELAY | DELETE | DESCRIBE | DESC | DESCENDING | DETACH | DICTIONARIES | DICTIONARY | DISK
475+
| DISTINCT | DISTRIBUTED | DROP | ELSE | END | ENGINE | EVENTS | EXISTS | EXPLAIN | EXPRESSION | EXTRACT | FETCHES | FINAL | FIRST
476+
| FLUSH | FOR | FOLLOWING | FOR | FORMAT | FREEZE | FROM | FULL | FUNCTION | GLOBAL | GRANULARITY | GROUP | HAVING | HIERARCHICAL | ID
477+
| IF | ILIKE | IN | INDEX | INJECTIVE | INNER | INSERT | INTERVAL | INTO | IS | IS_OBJECT_ID | JOIN | JSON_FALSE | JSON_TRUE | KEY
478+
| KILL | LAST | LAYOUT | LEADING | LEFT | LIFETIME | LIKE | LIMIT | LIVE | LOCAL | LOGS | MATERIALIZE | MATERIALIZED | MAX | MERGES
479+
| MIN | MODIFY | MOVE | MUTATION | NO | NOT | NULLS | OFFSET | ON | OPTIMIZE | OR | ORDER | OUTER | OUTFILE | OVER | PARTITION
480+
| POPULATE | PRECEDING | PREWHERE | PRIMARY | RANGE | RELOAD | REMOVE | RENAME | REPLACE | REPLICA | REPLICATED | RIGHT | ROLLUP | ROW
481+
| ROWS | SAMPLE | SELECT | SEMI | SENDS | SET | SETTINGS | SHOW | SOURCE | START | STOP | SUBSTRING | SYNC | SYNTAX | SYSTEM | TABLE
482+
| TABLES | TEMPORARY | TEST | THEN | TIES | TIMEOUT | TIMESTAMP | TOTALS | TRAILING | TRIM | TRUNCATE | TO | TOP | TTL | TYPE
483+
| UNBOUNDED | UNION | UPDATE | USE | USING | UUID | VALUES | VIEW | VOLUME | WATCH | WHEN | WHERE | WINDOW | WITH
468484
;
469485
keywordForAlias
470486
: DATE | FIRST | ID | KEY

0 commit comments

Comments
 (0)