From 957fce512d9408c89e98f5a4871e634579bf6c67 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 5 Jun 2025 13:12:14 -0700 Subject: [PATCH 1/2] fixed CTE wrapped with parenthesis --- .../jdbc/internal/ClickHouseParser.g4 | 2 +- .../jdbc/internal/SqlParserTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 b/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 index e94537c15..5b055cce0 100644 --- a/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 +++ b/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 @@ -40,7 +40,7 @@ query // CTE statement ctes - : WITH namedQuery (',' namedQuery)* + : LPAREN? WITH namedQuery (',' namedQuery)* RPAREN? ; namedQuery diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java index 992a5643e..5049d50f4 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java @@ -241,4 +241,24 @@ public static Object[][] testCreateStmtDP() { {"CREATE USER 'user01' IDENTIFIED BY 'qwerty'"}, }; } + + @Test(dataProvider = "testCTEStmtsDP") + public void testCTEStatements(String sql, int args) { + SqlParser parser = new SqlParser(); + ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql); + Assert.assertFalse(stmt.isHasErrors()); + Assert.assertEquals(stmt.getArgCount(), args); + } + + @DataProvider + public static Object[][] testCTEStmtsDP() { + return new Object[][] { + {"with ? as a, ? as b select a, b; -- two CTEs of the first form", 2}, + {"with a as (select ?), b as (select 2) select * from a, b; -- two CTEs of the second form", 1}, + {"(with a as (select ?) select * from a);", 1}, + {"with a as (select 1) select * from a; ", 0}, + {"(with ? as a select a);", 1}, + + }; + } } \ No newline at end of file From 4c1482d7c443b2b3cd09a1d77656ba2f4a9cf52c Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 5 Jun 2025 13:40:54 -0700 Subject: [PATCH 2/2] fixed interval grammar --- .../clickhouse/jdbc/internal/ClickHouseParser.g4 | 2 +- .../jdbc/internal/ParsedPreparedStatement.java | 1 + .../clickhouse/jdbc/internal/SqlParserTest.java | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 b/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 index 5b055cce0..a1dea4092 100644 --- a/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 +++ b/jdbc-v2/src/main/antlr4/com/clickhouse/jdbc/internal/ClickHouseParser.g4 @@ -644,7 +644,7 @@ columnExpr | CAST LPAREN columnExpr AS columnTypeExpr RPAREN # ColumnExprCast | DATE STRING_LITERAL # ColumnExprDate | EXTRACT LPAREN interval FROM columnExpr RPAREN # ColumnExprExtract - | INTERVAL columnExpr interval # ColumnExprInterval + | INTERVAL columnExpr interval? # ColumnExprInterval | SUBSTRING LPAREN columnExpr FROM columnExpr (FOR columnExpr)? RPAREN # ColumnExprSubstring | TIMESTAMP STRING_LITERAL # ColumnExprTimestamp | TRIM LPAREN (BOTH | LEADING | TRAILING) STRING_LITERAL FROM columnExpr RPAREN # ColumnExprTrim diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ParsedPreparedStatement.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ParsedPreparedStatement.java index d5e873d66..00d4aafdb 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ParsedPreparedStatement.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/ParsedPreparedStatement.java @@ -166,6 +166,7 @@ public void enterColumnExprParam(ClickHouseParser.ColumnExprParamContext ctx) { appendParameter(ctx.start.getStartIndex()); } + @Override public void enterColumnExprParamWithCast(ClickHouseParser.ColumnExprParamWithCastContext ctx) { appendParameter(ctx.start.getStartIndex()); diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java index 5049d50f4..11d4908f4 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/SqlParserTest.java @@ -261,4 +261,20 @@ public static Object[][] testCTEStmtsDP() { }; } + + @Test(dataProvider = "testMiscStmtDp") + public void testMiscStatements(String sql, int args) { + SqlParser parser = new SqlParser(); + ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql); + Assert.assertFalse(stmt.isHasErrors()); + Assert.assertEquals(stmt.getArgCount(), args); + } + + @DataProvider + public Object[][] testMiscStmtDp() { + return new Object[][] { + {"SELECT INTERVAL '1 day'", 0}, + {"SELECT INTERVAL 1 day", 0}, + }; + } } \ No newline at end of file