Skip to content

Commit 8db01eb

Browse files
committed
fixed CTE arguments positioning and fixed add column expression
1 parent f9dd217 commit 8db01eb

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/parser/ClickHouseParser.g4

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ alterStmt
6363
;
6464

6565
alterTableClause
66-
: ADD COLUMN (IF NOT EXISTS)? tableColumnDfnt (AFTER (nestedIdentifier | FIRST))? # AlterTableClauseAddColumn
67-
| ADD INDEX (IF NOT EXISTS)? tableIndexDfnt (AFTER (nestedIdentifier | FIRST))? # AlterTableClauseAddIndex
66+
: ADD COLUMN (IF NOT EXISTS)? tableColumnDfnt ((AFTER nestedIdentifier) | FIRST)? # AlterTableClauseAddColumn
67+
| ADD INDEX (IF NOT EXISTS)? tableIndexDfnt ((AFTER nestedIdentifier) | FIRST)? # AlterTableClauseAddIndex
6868
| ADD PROJECTION (IF NOT EXISTS)? tableProjectionDfnt (AFTER (nestedIdentifier | FIRST))? # AlterTableClauseAddProjection
6969
| ATTACH partitionClause (FROM tableIdentifier)? # AlterTableClauseAttach
7070
| CLEAR COLUMN (IF EXISTS)? nestedIdentifier (IN partitionClause)? # AlterTableClauseClearColumn
@@ -84,7 +84,7 @@ alterTableClause
8484
| MODIFY COLUMN (IF EXISTS)? nestedIdentifier COMMENT STRING_LITERAL # AlterTableClauseModifyComment
8585
| MODIFY COLUMN (IF EXISTS)? nestedIdentifier REMOVE tableColumnPropertyType # AlterTableClauseModifyRemove
8686
| MODIFY COLUMN (IF EXISTS)? tableColumnDfnt # AlterTableClauseModify
87-
| ALTER COLUMN (IF EXISTS)? identifier TYPE columnTypeExpr codecExpr? ttlClause? settingExprList? (AFTER (nestedIdentifier | FIRST))? # AlterTableClauseAlterType
87+
| ALTER COLUMN (IF EXISTS)? identifier TYPE columnTypeExpr codecExpr? ttlClause? settingExprList? ((AFTER nestedIdentifier) | FIRST)? # AlterTableClauseAlterType
8888
| MODIFY ORDER BY columnExpr # AlterTableClauseModifyOrderBy
8989
| MODIFY ttlClause # AlterTableClauseModifyTTL
9090
| MODIFY COMMENT literal # AlterTableClauseModifyComment
@@ -471,7 +471,7 @@ withClause
471471

472472
// CTE statement
473473
cteClause
474-
: WITH cteUnboundCol? (COMMA cteUnboundCol)* COMMA? namedQuery? (COMMA namedQuery)*
474+
: WITH (cteUnboundCol | namedQuery) (COMMA (cteUnboundCol | namedQuery))*
475475
;
476476

477477

@@ -487,6 +487,7 @@ cteUnboundCol
487487
: literal AS identifier # CteUnboundColLiteral
488488
| QUERY AS identifier # CteUnboundColParam
489489
| LPAREN? columnExpr RPAREN? AS? identifier? # CteUnboundColExpr
490+
| LPAREN selectStmt RPAREN AS identifier # CteUnboundSubQuery
490491
// | LPAREN cteStmt? selectStmt RPAREN AS identifier # CteUnboundNestedSelect
491492
;
492493

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ public static Object[][] testCreateStmtDP() {
233233

234234
@Test(dataProvider = "testCTEStmtsDP")
235235
public void testCTEStatements(String sql, int args) {
236-
System.out.println(sql);
237236
SqlParser parser = new SqlParser();
238237
ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql);
239238
Assert.assertEquals(stmt.getArgCount(), args, "Args mismatch");
@@ -269,6 +268,13 @@ public static Object[][] testCTEStmtsDP() {
269268
{COMPLEX_CTE, 4},
270269
{"WITH 'date' as const1, 'time' as const2, Tmp1 as (SELECT 1), Tmp2 as (SELECT * FROM Tmp1) SELECT * FROM Tmp2 ", 0},
271270
{"WITH query1 AS ( WITH 'a' as date1 SELECT * FROM tracking.event WHERE project='a' AND time>=starting_time AND time<ending_time GROUP BY date, user_id ) SELECT * FROM query1", 0},
271+
{"WITH a AS (SELECT ?), (SELECT 2) AS b SELECT b, *, c FROM a", 1},
272+
{"WITH a AS (SELECT ?), (SELECT 2) AS b, c as (SELECT ?) SELECT *, b FROM a, c", 2},
273+
{"WITH (SELECT 2) AS b, a as (select ?), (select 3) AS c SELECT *, b, c FROM a", 1},
274+
{"WITH a AS (SELECT 2), (WITH 'a' as b1 SELECT 3, b1) AS b SELECT b, * FROM a", 0},
275+
{"WITH a AS (SELECT ?), (WITH ? as b1 SELECT 3, b1) AS b SELECT b, * FROM a", 2},
276+
{"WITH a AS (SELECT 2), (WITH 'a' as b1 SELECT 3, b1) AS b, c AS (SELECT 4) SELECT b, * FROM a, c", 0},
277+
272278
};
273279
}
274280

@@ -285,6 +291,8 @@ public Object[][] testMiscStmtDp() {
285291
return new Object[][] {
286292
{"SELECT INTERVAL '1 day'", 0},
287293
{"SELECT INTERVAL 1 day", 0},
294+
{"SELECT ?", 1},
295+
{"(SELECT ?)", 1},
288296
{"SELECT * FROM table key WHERE ts = ?", 1},
289297
{"SELECT * FROM table source WHERE ts = ?", 1},
290298
{"SELECT * FROM table after WHERE ts = ?", 1},
@@ -540,7 +548,7 @@ public static Object[][] testStatementWithoutResultSetDP() {
540548
{"CREATE VIEW `test_db`.`source_table` source AS ( SELECT * FROM source_a UNION SELECT * FROM source_b) ENGINE = MaterializedView", 0, false},
541549
{"CREATE VIEW `test_db`.`source_table` source AS ( SELECT * FROM source_a UNION SELECT * FROM source_b) ENGINE = MaterializedView()", 0, false},
542550
{"CREATE VIEW `test_db`.`source_table` source AS ( SELECT * FROM source_a UNION SELECT * FROM source_b) ENGINE = MaterializedView() COMMENT 'for tests'", 0, false},
543-
{ "CREATE DICTIONARY `test_db`.dict1 (k1 UInt64 EXPRESSION(k1 + 1), k2 String DEFAULT 'default', a1 Array(UInt64) DEFAULT []) PRIMARY KEY k1 SOURCE(CLICKHOUSE(db='test_db', table='dict1')) LAYOUT(FLAT()) LIFETIME(MIN 1000 MAX 2000)", 0, false},
551+
{"CREATE DICTIONARY `test_db`.dict1 (k1 UInt64 EXPRESSION(k1 + 1), k2 String DEFAULT 'default', a1 Array(UInt64) DEFAULT []) PRIMARY KEY k1 SOURCE(CLICKHOUSE(db='test_db', table='dict1')) LAYOUT(FLAT()) LIFETIME(MIN 1000 MAX 2000)", 0, false},
544552
{"CREATE DICTIONARY `test_db`.dict1 (k1 UInt64 (k1 + 1), k2 String DEFAULT 'default', a1 Array(UInt64) DEFAULT []) PRIMARY KEY k1 SOURCE(CLICKHOUSE(db='test_db', table='dict1')) LAYOUT(FLAT()) LIFETIME(MIN 1000 MAX 2000) SETTINGS(cache_size = 1000) COMMENT 'for tests'", 0, false},
545553
{"CREATE OR REPLACE DICTIONARY IF NOT EXISTS `test_db`.dict1 (k1 UInt64 (k1 + 1), k2 String DEFAULT 'default', a1 Array(UInt64) DEFAULT []) PRIMARY KEY k1 SOURCE(CLICKHOUSE(db='test_db', table='dict1')) LAYOUT(FLAT()) LIFETIME(MIN 1000 MAX 2000) SETTINGS(cache_size = 1000, v='123') COMMENT 'for tests'", 0, false},
546554
{"CREATE FUNCTION test_func AS () -> 10", 0, false},
@@ -562,11 +570,12 @@ public static Object[][] testStatementWithoutResultSetDP() {
562570
{"alter table t2 alter column v type Int32", 0, false},
563571
{"ALTER TABLE t MODIFY COLUMN j default 1", 0, false},
564572
{"ALTER TABLE t MODIFY COMMENT 'comment'", 0, false},
573+
{"ALTER TABLE t ADD COLUMN id Int32 AFTER v", 0, false},
574+
{"ALTER TABLE t ADD COLUMN id Int32 FIRST", 0, false},
565575
{"DELETE FROM db.table1 ON CLUSTER `default` WHERE max(a, 10) > ?", 1, false},
566576
{"DELETE FROM table WHERE a = ?", 1, false},
567577
{"DELETE FROM table WHERE a = ? AND b = ?", 2, false},
568578
{"DELETE FROM hits WHERE Title LIKE '%hello%';", 0, false},
569-
570579
{"SYSTEM START FETCHES", 0, false},
571580
{"SYSTEM RELOAD DICTIONARIES", 0, false},
572581
{"SYSTEM RELOAD DICTIONARIES ON CLUSTER `default`", 0, false},

0 commit comments

Comments
 (0)