Skip to content

Commit 24c8e81

Browse files
committed
Added new statements to javacc. fixed some existing statements
1 parent b930ca2 commit 24c8e81

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/parser/javacc/StatementType.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ public enum StatementType {
2828
UPDATE(LanguageType.DML, OperationType.WRITE, false), // the upcoming light-weight update statement
2929
USE(LanguageType.DDL, OperationType.UNKNOWN, true), // use statement
3030
WATCH(LanguageType.DDL, OperationType.UNKNOWN, true), // watch statement
31-
TRANSACTION(LanguageType.TCL, OperationType.WRITE, true); // TCL statement
31+
TRANSACTION(LanguageType.TCL, OperationType.WRITE, true), // TCL statement
32+
UNDROP(LanguageType.DDL, OperationType.UNKNOWN, false),
33+
MOVE(LanguageType.DCL, OperationType.UNKNOWN, false),
34+
EXCHANGE(LanguageType.DML, OperationType.UNKNOWN, false),
3235

36+
;
3337
private LanguageType langType;
3438
private OperationType opType;
3539
private boolean idempotent;

jdbc-v2/src/main/javacc/ClickHouseSqlParser.jj

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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/
480495
void 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/
619634
void 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/
679693
void 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
685698
void 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> >

jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/BaseSqlParserFacadeTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,9 @@ public Object[][] testMiscStmtDp() {
348348
};
349349
}
350350

351-
private static final String SELECT_WITH_WHERE_CLAUSE_FUNC_WITH_PARAMS = "SELECT `source`.`id` AS `id`,\n" +
351+
private static final String SELECT_WITH_WHERE_CLAUSE_FUNC_WITH_PARAMS = "SELECT `source`.`id` AS `id`, \n" +
352352
" `source`.`val` AS `val` FROM\n" +
353-
" (with base as (\\n select 1 id, 'abc' val\\n)\\nselect * from base)\n" +
353+
" (with base as (\n select 1 id, 'abc' val\n) \nselect * from base)\n" +
354354
" AS `source`\n" +
355355
" WHERE `positionCaseInsensitiveUTF8`(`source`.`val`, ?) > ? LIMIT 2000";
356356

@@ -646,6 +646,7 @@ public static Object[][] testStatementWithoutResultSetDP() {
646646
{"TRUNCATE TABLE `db1`.`table1` ON CLUSTER `default` SYNC", 0, false},
647647
{"TRUNCATE TABLE `db1`.`table1` ON CLUSTER `default`", 0, false},
648648
{"TRUNCATE TABLE `db1`.`table1`", 0, false},
649+
{"TRUNCATE TEMPORARY TABLE t", 0, false},
649650
{"TRUNCATE DATABASE IF EXISTS db ON CLUSTER `cluster`", 0, false},
650651
{"TRUNCATE DATABASE IF EXISTS db", 0, false},
651652
{"TRUNCATE DATABASE `db`", 0, false},

0 commit comments

Comments
 (0)