Skip to content

Commit 4eff362

Browse files
authored
Merge pull request #2425 from ClickHouse/jdbc_2422
[jdbc-v2] Fixes arguments with casts
2 parents a607f93 + 8b35b27 commit 4eff362

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ OCTAL_LITERAL : '0' OCT_DIGIT+;
223223
DECIMAL_LITERAL : DEC_DIGIT+;
224224
HEXADECIMAL_LITERAL : '0' X HEX_DIGIT+;
225225
226+
CAST_OP : '::';
227+
226228
// It's important that quote-symbol is a single character.
227229
STRING_LITERAL:
228230
QUOTE_SINGLE (~([\\']) | (BACKSLASH .) | (QUOTE_SINGLE QUOTE_SINGLE))* QUOTE_SINGLE

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ columnExpr
649649
| LBRACKET columnExprList? RBRACKET # ColumnExprArray
650650
| columnIdentifier # ColumnExprIdentifier
651651
| QUERY # ColumnExprParam
652+
| QUERY CAST_OP identifier # ColumnExprParamWithCast
652653
;
653654

654655
columnArgList

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ public void enterColumnExprParam(ClickHouseParser.ColumnExprParamContext ctx) {
167167
appendParameter(ctx.start.getStartIndex());
168168
}
169169

170+
@Override
171+
public void enterColumnExprParamWithCast(ClickHouseParser.ColumnExprParamWithCastContext ctx) {
172+
appendParameter(ctx.start.getStartIndex());
173+
}
174+
170175
@Override
171176
public void visitErrorNode(ErrorNode node) {
172177
setHasErrors(true);

jdbc-v2/src/test/java/com/clickhouse/jdbc/PreparedStatementTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.clickhouse.data.ClickHouseVersion;
44
import com.clickhouse.jdbc.internal.DriverProperties;
55
import org.apache.commons.lang3.RandomStringUtils;
6+
import org.testcontainers.shaded.com.fasterxml.jackson.databind.deser.std.UUIDDeserializer;
67
import org.testng.Assert;
78
import org.testng.annotations.DataProvider;
89
import org.testng.annotations.Ignore;
@@ -1051,4 +1052,27 @@ public void testNullValues() throws Exception {
10511052
}
10521053
}
10531054
}
1055+
1056+
@Test
1057+
public void testParamWithCast() throws Exception {
1058+
final String sql = " SELECT ?::integer, '?::integer', 123, ?:: UUID, ?";
1059+
try (Connection conn = getJdbcConnection()) {
1060+
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
1061+
stmt.setString(1, "1000");
1062+
UUID uuid = UUID.randomUUID();
1063+
stmt.setString(1, "1000");
1064+
stmt.setString(2, uuid.toString());
1065+
stmt.setInt(3, 3003001);
1066+
1067+
try (ResultSet rs = stmt.executeQuery()) {
1068+
assertTrue(rs.next());
1069+
Assert.assertEquals(rs.getInt(1), 1000);
1070+
Assert.assertEquals(rs.getString(2), "?::integer");
1071+
Assert.assertEquals(rs.getInt(3), 123);
1072+
Assert.assertEquals(rs.getString(4), uuid.toString());
1073+
Assert.assertEquals(rs.getInt(5), 3003001);
1074+
}
1075+
}
1076+
}
1077+
}
10541078
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.clickhouse.jdbc.internal;
22

33

4+
import org.testng.Assert;
45
import org.testng.annotations.Test;
56

67
import static org.testng.Assert.assertEquals;
@@ -193,4 +194,20 @@ public void testEscapeQuotes() {
193194
assertEquals(SqlParser.escapeQuotes(inStr[i]), outStr[i]);
194195
}
195196
}
197+
198+
@Test
199+
public void testStmtWithCasts() {
200+
String sql = "SELECT ?::integer, ?, '?::integer' FROM table WHERE v = ?::integer"; // CAST(?, INTEGER)
201+
SqlParser parser = new SqlParser();
202+
ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql);
203+
Assert.assertEquals(stmt.getArgCount(), 3);
204+
}
205+
206+
@Test
207+
public void testStmtWithFunction() {
208+
String sql = "SELECT `parseDateTimeBestEffort`(?, ?) as dt FROM table WHERE v > `parseDateTimeBestEffort`(?, ?) ";
209+
SqlParser parser = new SqlParser();
210+
ParsedPreparedStatement stmt = parser.parsePreparedStatement(sql);
211+
Assert.assertEquals(stmt.getArgCount(), 4);
212+
}
196213
}

0 commit comments

Comments
 (0)