@@ -243,6 +243,7 @@ selectStmt:
243
243
SELECT DISTINCT ? topClause? columnExprList
244
244
fromClause?
245
245
arrayJoinClause?
246
+ windowClause?
246
247
prewhereClause?
247
248
whereClause?
248
249
groupByClause? (WITH (CUBE | ROLLUP ))? (WITH TOTALS )?
@@ -257,6 +258,7 @@ withClause: WITH columnExprList;
257
258
topClause : TOP DECIMAL_LITERAL (WITH TIES )?;
258
259
fromClause : FROM joinExpr;
259
260
arrayJoinClause : (LEFT | INNER )? ARRAY JOIN columnExprList;
261
+ windowClause : WINDOW identifier AS LPAREN windowExpr RPAREN ;
260
262
prewhereClause : PREWHERE columnExpr;
261
263
whereClause : WHERE columnExpr;
262
264
groupByClause : GROUP BY ((CUBE | ROLLUP ) LPAREN columnExprList RPAREN | columnExprList);
@@ -298,6 +300,18 @@ ratioExpr: numberLiteral (SLASH numberLiteral)?;
298
300
settingExprList : settingExpr (COMMA settingExpr)*;
299
301
settingExpr : identifier EQ_SINGLE literal;
300
302
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
+
301
315
// SET statement
302
316
303
317
setStmt : SET settingExprList;
@@ -364,6 +378,8 @@ columnExpr
364
378
| SUBSTRING LPAREN columnExpr FROM columnExpr (FOR columnExpr)? RPAREN # ColumnExprSubstring
365
379
| TIMESTAMP STRING_LITERAL # ColumnExprTimestamp
366
380
| 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
367
383
| identifier (LPAREN columnExprList? RPAREN )? LPAREN DISTINCT ? columnArgList? RPAREN # ColumnExprFunction
368
384
| literal # ColumnExprLiteral
369
385
@@ -454,17 +470,17 @@ interval: SECOND | MINUTE | HOUR | DAY | WEEK | MONTH | QUARTER | YEAR;
454
470
keyword
455
471
// except NULL_SQL, INF, NAN_SQL
456
472
: 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
468
484
;
469
485
keywordForAlias
470
486
: DATE | FIRST | ID | KEY
0 commit comments