@@ -415,6 +415,7 @@ void stmt(): {} {
415415 | detachStmt() { token_source.stmtType = StatementType.DETACH; }
416416 | dropStmt() { token_source.stmtType = StatementType.DROP; }
417417 | existsStmt() { token_source.stmtType = StatementType.EXISTS; }
418+ | exchangeStmt() { token_source.stmtType = StatementType.EXCHANGE; }
418419 | explainStmt() { token_source.stmtType = StatementType.EXPLAIN; }
419420 | insertStmt() { token_source.stmtType = StatementType.INSERT; }
420421 | grantStmt() { token_source.stmtType = StatementType.GRANT; }
@@ -428,10 +429,12 @@ void stmt(): {} {
428429 | showStmt() { token_source.stmtType = StatementType.SHOW; }
429430 | systemStmt() { token_source.stmtType = StatementType.SYSTEM; }
430431 | truncateStmt() { token_source.stmtType = StatementType.TRUNCATE; }
432+ | undropStmt() { token_source.stmtType = StatementType.UNDROP; }
431433 | updateStmt() { token_source.stmtType = StatementType.UPDATE; }
432434 | useStmt() { token_source.stmtType = StatementType.USE; }
433435 | watchStmt() { token_source.stmtType = StatementType.WATCH; }
434436 | txStmt() { token_source.stmtType = StatementType.TRANSACTION; }
437+ | moveStmt() { token_source.stmtType = StatementType.MOVE; }
435438}
436439
437440// https://clickhouse.tech/docs/en/sql-reference/statements/alter/
@@ -476,9 +479,21 @@ void checkStmt(): {} { // not interested
476479 <CHECK> anyExprList()
477480}
478481
482+ void undropStmt(): {} { // not interested
483+ <UNDROP> anyExprList()
484+ }
485+
486+ void moveStmt(): {} { // not interested
487+ <MOVE> (LOOKAHEAD(2) <USER> | <ROLE>)? anyExprList()
488+ }
489+
490+ void exchangeStmt(): {} { // not interested
491+ <EXCHANGE> (<TABLES> | <DICTIONARIES>) anyExprList()
492+ }
493+
479494// https://clickhouse.tech/docs/en/sql-reference/statements/create/
480495void createStmt(): {} {
481- <CREATE> (
496+ <CREATE> (LOOKAHEAD(2) <OR> <REPLACE>)? (
482497 LOOKAHEAD(2)
483498 (
484499 <DATABASE> { token_source.addPosition(token); }
@@ -617,7 +632,6 @@ void revokeStmt(): {} { // not interested
617632
618633// https://clickhouse.tech/docs/en/sql-reference/statements/select/
619634void selectStmt(): {} {
620- // FIXME with (select 1), (select 2), 3 select *
621635 (withClause())?
622636 <SELECT> (LOOKAHEAD(2) <DISTINCT>)? (LOOKAHEAD(2) topClause())? columnExprList()
623637 (LOOKAHEAD(2) <FROM> tableClause(true) (<COMMA> tableClause(false))*)?
@@ -677,13 +691,12 @@ void systemStmt(): {} { // not interested
677691
678692// https://clickhouse.tech/docs/en/sql-reference/statements/truncate/
679693void truncateStmt(): {} {
680- <TRUNCATE> (LOOKAHEAD(2) <TEMPORARY>)? (LOOKAHEAD(2) <TABLE>)? (LOOKAHEAD(2) <IF> <EXISTS>)?
681- tableIdentifier(true) (clusterClause())?
694+ <TRUNCATE> (LOOKAHEAD(2) <TEMPORARY>)? (LOOKAHEAD(2) <TABLE>)? (LOOKAHEAD(2) <IF> <EXISTS>)? anyExprList()
682695}
683696
684697// upcoming lightweight mutation - see https://github.com/ClickHouse/ClickHouse/issues/19627
685698void updateStmt(): {} {
686- <UPDATE> { token_source.addPosition(token); } tableIdentifier(true)
699+ <UPDATE> { token_source.addPosition(token); } tableIdentifier(true) (LOOKAHEAD(2) clusterClause())?
687700 <SET> { token_source.addPosition(token); } anyExprList()
688701}
689702
@@ -795,6 +808,7 @@ void columnExpr(): { Token t; } {
795808 | <LBRACE> (LOOKAHEAD(2) anyExprList())? <RBRACE>
796809 | <LBRACKET> (LOOKAHEAD(2) anyExprList())? <RBRACKET>
797810 | <LPAREN> anyExprList() <RPAREN>
811+ | LOOKAHEAD(3) literal() <REGEXP> literal()
798812 | (LOOKAHEAD(2) macro())+
799813 | LOOKAHEAD(2, { !(tokenIn(1, INF, NAN, NULL) && tokenIn(2, DOT)) }) literal()
800814 | LOOKAHEAD(2, { getToken(2).kind == LPAREN }) functionExpr()
@@ -1004,9 +1018,9 @@ Token anyKeyword(): { Token t; } {
10041018 (
10051019 // leading keywords(except with)
10061020 t = <ALTER> | t = <ATTACH> | t = <CHECK> | t = <CREATE> | t = <DELETE> | t = <DESC> | t = <DESCRIBE>
1007- | t = <DETACH> | t = <DROP> | t = <EXISTS> | t = <EXPLAIN> | t = <GRANT> | t = <INSERT> | t = <KILL>
1008- | t = <OPTIMIZE> | t = <RENAME> | t = <REVOKE> | t = <SELECT> | t = <SET> | t = <SHOW> | t = <SYSTEM>
1009- | t = <TRUNCATE> | t = <UPDATE> | t = <USE> | t = <WATCH>
1021+ | t = <DETACH> | t = <DROP> | t = <EXCHANGE> | t = < EXISTS> | t = <EXPLAIN> | t = <GRANT> | t = <INSERT> | t = <KILL>
1022+ | t = <MOVE> | t = < OPTIMIZE> | t = <RENAME> | t = <REVOKE> | t = <SELECT> | t = <SET> | t = <SHOW> | t = <SYSTEM>
1023+ | t = <TRUNCATE> | t = <UPDATE> | t = <USE> | t = <WATCH> | t = <UNDROP>
10101024 // others
10111025 | t = <ALL> | t = <AND> | t = <APPLY> | t = <ARRAY> | t = <AS> | t = <ASOF> | t = <BETWEEN> | t = <CASE>
10121026 | t = <CLUSTER> | t = <COMPRESSION> | t = <DATE> | t = <DATABASE> | t = <DATABASES> | t = <DICTIONARY> | t = <DICTIONARIES>
@@ -1017,7 +1031,7 @@ Token anyKeyword(): { Token t; } {
10171031 | t = <PREWHERE> | t = <PROFILE> | t = <QUOTA> | t = <REPLACE> | t = <RIGHT> | t = <ROLE> | t = <ROW> | t = <SAMPLE>
10181032 | t = <SETTINGS> | t = <STDOUT> | t = <TEMPORARY> | t = <TABLE> | t = <TABLES> | t = <THEN> | t = <TIES> | t = <TIMESTAMP>
10191033 | t = <TOP> | t = <TOTALS> | t = <VALUES> | t = <VIEW> | t = <USER> | t = <UNION> | t = <USING>
1020- | t = <WHEN> | t = <WHERE> | t = <WITH>
1034+ | t = <WHEN> | t = <WHERE> | t = <WITH> | t = <REGEXP>
10211035 // interval
10221036 | t = <SECOND> | t = <MINUTE> | t = <HOUR> | t = <DAY> | t = <WEEK> | t = <MONTH> | t = <QUARTER> | t = <YEAR>
10231037 // values
@@ -1030,16 +1044,16 @@ Token keyword(): { Token t; } {
10301044 (
10311045 // leading keywords(except with)
10321046 t = <ALTER> | t = <ATTACH> | t = <CHECK> | t = <CREATE> | t = <DELETE> | t = <DESC> | t = <DESCRIBE>
1033- | t = <DETACH> | t = <DROP> | t = <EXISTS> | t = <EXPLAIN> | t = <GRANT> | t = <INSERT> | t = <KILL>
1034- | t = <OPTIMIZE> | t = <RENAME> | t = <REVOKE> | t = <SELECT> | t = <SET> | t = <SHOW> | t = <SYSTEM>
1035- | t = <TRUNCATE> | t = <UPDATE> | t = <USE> | t = <WATCH>
1047+ | t = <DETACH> | t = <DROP> | t = <EXCHANGE> | t = < EXISTS> | t = <EXPLAIN> | t = <GRANT> | t = <INSERT> | t = <KILL>
1048+ | t = <MOVE> | t = < OPTIMIZE> | t = <RENAME> | t = <REVOKE> | t = <SELECT> | t = <SET> | t = <SHOW> | t = <SYSTEM>
1049+ | t = <TRUNCATE> | t = <UPDATE> | t = <USE> | t = <WATCH> | t = <UNDROP>
10361050 // others
10371051 | t = <CASE> | t = <CLUSTER> | t = <DATE> | t = <DATABASE> | t = <DATABASES> | t = <DICTIONARY>
10381052 | t = <DICTIONARIES> | t = <DISTINCT> | t = <ELSE> | t = <END> | t = <EXCEPT>| t = <FUNCTION>
10391053 | t = <IF> | t = <INTERVAL> | t = <IS> | t = <INFILE> | t = <LIVE> | t = <MATERIALIZED> | t = <OUTFILE> | t = <POLICY>
10401054 | t = <PROFILE> | t = <QUOTA> | t = <REPLACE> | t = <ROLE> | t = <ROW> | t = <TEMPORARY>
10411055 | t = <TABLE> | t = <TABLES> | t = <THEN> | t = <TIES> | t = <TIMESTAMP> | t = <TOP> | t = <TOTALS>
1042- | t = <VALUES> | t = <VIEW> | t = <WHEN> | t = <USER>
1056+ | t = <VALUES> | t = <VIEW> | t = <WHEN> | t = <USER> | t = <REGEXP>
10431057 // interval
10441058 | t = <SECOND> | t = <MINUTE> | t = <HOUR> | t = <DAY> | t = <WEEK> | t = <MONTH> | t = <QUARTER> | t = <YEAR>
10451059 // values
@@ -1060,10 +1074,12 @@ TOKEN: {
10601074 | <DETACH : <D> <E> <T> <A> <C> <H> >
10611075 | <DROP : <D> <R> <O> <P> >
10621076 | <EXISTS : <E> <X> <I> <S> <T> <S> >
1077+ | <EXCHANGE : <E> <X> <C> <H> <A> <N> <G> <E>>
10631078 | <EXPLAIN : <E> <X> <P> <L> <A> <I> <N> >
10641079 | <GRANT : <G> <R> <A> <N> <T> >
10651080 | <INSERT : <I> <N> <S> <E> <R> <T> >
10661081 | <KILL : <K> <I> <L> <L> >
1082+ | <MOVE : <M> <O> <V> <E> >
10671083 | <OPTIMIZE : <O> <P> <T> <I> <M> <I> <Z> <E>>
10681084 | <RENAME : <R> <E> <N> <A> <M> <E> >
10691085 | <REVOKE : <R> <E> <V> <O> <K> <E> >
@@ -1078,6 +1094,7 @@ TOKEN: {
10781094 | <BEGIN : <B> <E> <G> <I> <N> >
10791095 | <COMMIT : <C> <O> <M> <M> <I> <T> >
10801096 | <ROLLBACK : <R> <O> <L> <L> <B> <A> <C> <K>>
1097+ | <UNDROP : <U> <N> <D> <R> <O> <P> >
10811098
10821099 | <ALL : <A> <L> <L> >
10831100 | <AND : <A> <N> <D> >
@@ -1156,6 +1173,7 @@ TOKEN: {
11561173 | <WHEN : <W> <H> <E> <N> >
11571174 | <WHERE : <W> <H> <E> <R> <E> >
11581175 | <WITH : <W> <I> <T> <H> >
1176+ | <REGEXP : <R> <E> <G> <E> <X> <P> >
11591177
11601178 | <SECOND : <S> <E> <C> <O> <N> <D> >
11611179 | <MINUTE : <M> <I> <N> <U> <T> <E> >
0 commit comments