Skip to content

Commit 052c3ab

Browse files
authored
Merge pull request #2433 from ClickHouse/jdbc_fix_2431
[jdbc-v2] Fix parser grammar
2 parents fbc2248 + 4c1482d commit 052c3ab

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ query
4040

4141
// CTE statement
4242
ctes
43-
: WITH namedQuery (',' namedQuery)*
43+
: LPAREN? WITH namedQuery (',' namedQuery)* RPAREN?
4444
;
4545

4646
namedQuery
@@ -644,7 +644,7 @@ columnExpr
644644
| CAST LPAREN columnExpr AS columnTypeExpr RPAREN # ColumnExprCast
645645
| DATE STRING_LITERAL # ColumnExprDate
646646
| EXTRACT LPAREN interval FROM columnExpr RPAREN # ColumnExprExtract
647-
| INTERVAL columnExpr interval # ColumnExprInterval
647+
| INTERVAL columnExpr interval? # ColumnExprInterval
648648
| SUBSTRING LPAREN columnExpr FROM columnExpr (FOR columnExpr)? RPAREN # ColumnExprSubstring
649649
| TIMESTAMP STRING_LITERAL # ColumnExprTimestamp
650650
| TRIM LPAREN (BOTH | LEADING | TRAILING) STRING_LITERAL FROM columnExpr RPAREN # ColumnExprTrim

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ParsedPreparedStatement.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public void enterColumnExprParam(ClickHouseParser.ColumnExprParamContext ctx) {
166166
appendParameter(ctx.start.getStartIndex());
167167
}
168168

169+
169170
@Override
170171
public void enterColumnExprParamWithCast(ClickHouseParser.ColumnExprParamWithCastContext ctx) {
171172
appendParameter(ctx.start.getStartIndex());

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,40 @@ public static Object[][] testCreateStmtDP() {
241241
{"CREATE USER 'user01' IDENTIFIED BY 'qwerty'"},
242242
};
243243
}
244+
245+
@Test(dataProvider = "testCTEStmtsDP")
246+
public void testCTEStatements(String sql, int args) {
247+
SqlParser parser = new SqlParser();
248+
ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql);
249+
Assert.assertFalse(stmt.isHasErrors());
250+
Assert.assertEquals(stmt.getArgCount(), args);
251+
}
252+
253+
@DataProvider
254+
public static Object[][] testCTEStmtsDP() {
255+
return new Object[][] {
256+
{"with ? as a, ? as b select a, b; -- two CTEs of the first form", 2},
257+
{"with a as (select ?), b as (select 2) select * from a, b; -- two CTEs of the second form", 1},
258+
{"(with a as (select ?) select * from a);", 1},
259+
{"with a as (select 1) select * from a; ", 0},
260+
{"(with ? as a select a);", 1},
261+
262+
};
263+
}
264+
265+
@Test(dataProvider = "testMiscStmtDp")
266+
public void testMiscStatements(String sql, int args) {
267+
SqlParser parser = new SqlParser();
268+
ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql);
269+
Assert.assertFalse(stmt.isHasErrors());
270+
Assert.assertEquals(stmt.getArgCount(), args);
271+
}
272+
273+
@DataProvider
274+
public Object[][] testMiscStmtDp() {
275+
return new Object[][] {
276+
{"SELECT INTERVAL '1 day'", 0},
277+
{"SELECT INTERVAL 1 day", 0},
278+
};
279+
}
244280
}

0 commit comments

Comments
 (0)