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 9187387cc..d6b06a28f 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 @@ -41,7 +41,7 @@ query // CTE statement ctes - : LPAREN? WITH (cteUnboundCol COMMA)* namedQuery (COMMA namedQuery)* RPAREN? + : LPAREN? WITH cteUnboundCol? (COMMA cteUnboundCol)* COMMA? namedQuery (COMMA namedQuery)* RPAREN? ; namedQuery @@ -55,6 +55,8 @@ columnAliases cteUnboundCol : (literal AS identifier) # CteUnboundColLiteral | (QUERY AS identifier) # CteUnboundColParam + | LPAREN columnExpr RPAREN AS identifier # CteUnboundColExpr + | LPAREN ctes? selectStmt RPAREN AS identifier # CteUnboundNestedSelect ; // ALTER statement @@ -438,6 +440,11 @@ fromClause : FROM joinExpr | FROM identifier LPAREN QUERY RPAREN | FROM ctes + | FROM identifier LPAREN viewParam (COMMA viewParam)? RPAREN + ; + +viewParam + : identifier EQ_SINGLE (literal | QUERY) ; arrayJoinClause @@ -937,6 +944,7 @@ columnExpr | LBRACKET columnExprList? RBRACKET # ColumnExprArray | columnIdentifier # ColumnExprIdentifier | QUERY (CAST_OP identifier)? # ColumnExprParam + | columnExpr REGEXP literal # ColumnExprRegexp ; columnArgList 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 8b2496239..6fcac9d3f 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 @@ -205,6 +205,13 @@ public void enterFromClause(ClickHouseParser.FromClauseContext ctx) { } } + @Override + public void enterViewParam(ClickHouseParser.ViewParamContext ctx) { + if (ctx.QUERY() != null) { + appendParameter(ctx.QUERY().getSymbol().getStartIndex()); + } + } + private void appendParameter(int startIndex) { argCount++; if (argCount > paramPositions.length) { 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 d5f3c1ee4..61e84df1b 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 @@ -322,7 +322,10 @@ public Object[][] testMiscStmtDp() { {"SELECT v FROM t WHERE f in (?)", 1}, {"SELECT v FROM t WHERE a > 10 AND event NOT IN (?)", 1}, {"SELECT v FROM t WHERE f in (1, 2, 3)", 0}, - {"with ? as val1, numz as (select val1, number from system.numbers limit 10) select * from numz", 1} + {"with ? as val1, numz as (select val1, number from system.numbers limit 10) select * from numz", 1}, + {"WITH 'hello' REGEXP 'h' AS result SELECT 1", 0}, + {"WITH (select 1) as a, z AS (select 2) SELECT 1", 0}, + {"SELECT result FROM test_view(myParam = ?)", 1}, }; }