Skip to content

Commit 0cbf958

Browse files
committed
Fixed issue with # comments
1 parent 9cb7738 commit 0cbf958

File tree

4 files changed

+35
-32
lines changed

4 files changed

+35
-32
lines changed

jdbc-v2/src/main/java/com/clickhouse/jdbc/ConnectionImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ public ConnectionImpl(String url, Properties info) throws SQLException {
117117
this.metadata = new DatabaseMetaDataImpl(this, false, url);
118118
this.defaultCalendar = Calendar.getInstance();
119119

120-
this.sqlParser = SqlParserFacade.getParser(SqlParserFacade.SQLParser.ANTLR4_PARAMS_PARSER.name()); // TODO: path config string here
120+
121+
this.sqlParser = SqlParserFacade.getParser(config.getDriverProperty(DriverProperties.SQL_PARSER.getKey(),
122+
DriverProperties.SQL_PARSER.getDefaultValue()));
121123
this.featureManager = new FeatureManager(this.config);
122124
} catch (SQLException e) {
123125
throw e;

jdbc-v2/src/main/java/com/clickhouse/jdbc/DriverProperties.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ public enum DriverProperties {
5757
*
5858
*/
5959
USE_MAX_RESULT_ROWS("jdbc_use_max_result_rows", String.valueOf(Boolean.FALSE)),
60+
61+
/**
62+
* Configures what SQL parser will be used. Choices:
63+
* <ul>
64+
* <li>ANTLR4 - parser extracts required information but PreparedStatement parameters parsed separately.</li>
65+
* <li>ANTLR4_PARAMS_PARSER - parser extracts required information AND parameter positions.</li>
66+
* <li>JAVACC - parser extracts required information but PreparedStatement parameters parsed separately.</li>
67+
* </ul>
68+
*/
69+
SQL_PARSER("jdbc_sql_parser", "ANTLR4", List.of("ANTLR4", "ANTLR4_PARAMS_PARSER", "JAVACC")),
6070
;
6171

6272

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ private static void parseParameters(String originalQuery, ParsedPreparedStatemen
280280
continue;
281281
} else if (i + 1 < len) {
282282
char nextCh = originalQuery.charAt(i + 1);
283-
if (ch == '-' && nextCh == ch) {
283+
if ((ch == '-' && nextCh == ch) || (ch == '#')) {
284284
i = ClickHouseUtils.skipSingleLineComment(originalQuery, i + 2, len) - 1;
285285
} else if (ch == '/' && nextCh == '*') {
286286
i = ClickHouseUtils.skipMultiLineComment(originalQuery, i + 2, len) - 1;

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

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,6 @@
1111

1212
public abstract class BaseSqlParserFacadeTest {
1313

14-
// @Test(groups = {"integration"})
15-
// public void testWithComments() throws Exception {
16-
// assertEquals(SqlParser.parseStatementType(" /* INSERT TESTING */\n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
17-
// assertEquals(SqlParser.parseStatementType("/* SELECT TESTING */\n INSERT INTO test_table VALUES (1)").getType(), SqlParser.StatementType.INSERT);
18-
// assertEquals(SqlParser.parseStatementType("/* INSERT TESTING */\n\n\n UPDATE test_table SET num = 2").getType(), SqlParser.StatementType.UPDATE);
19-
// assertEquals(SqlParser.parseStatementType("-- INSERT TESTING */\n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
20-
// assertEquals(SqlParser.parseStatementType(" -- SELECT TESTING \n -- SELECT AGAIN \n INSERT INTO test_table VALUES (1)").getType(), SqlParser.StatementType.INSERT);
21-
// assertEquals(SqlParser.parseStatementType(" SELECT 42 -- INSERT TESTING").getType(), SqlParser.StatementType.SELECT);
22-
// assertEquals(SqlParser.parseStatementType("#! INSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
23-
// assertEquals(SqlParser.parseStatementType("#!INSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
24-
// assertEquals(SqlParser.parseStatementType("# INSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
25-
// assertEquals(SqlParser.parseStatementType("#INSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.SELECT);
26-
// assertEquals(SqlParser.parseStatementType("\nINSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.INSERT_INTO_SELECT);
27-
// assertEquals(SqlParser.parseStatementType(" \n INSERT TESTING \n SELECT 1 AS num").getType(), SqlParser.StatementType.INSERT_INTO_SELECT);
28-
// assertEquals(SqlParser.parseStatementType("INSERT INTO t SELECT 1 AS num").getType(), SqlParser.StatementType.INSERT_INTO_SELECT);
29-
// assertEquals(SqlParser.parseStatementType("select 1 AS num").getType(), SqlParser.StatementType.SELECT);
30-
// assertEquals(SqlParser.parseStatementType("insert into test_table values (1)").getType(), SqlParser.StatementType.INSERT);
31-
// assertEquals(SqlParser.parseStatementType("update test_table set num = 2").getType(), SqlParser.StatementType.UPDATE);
32-
// assertEquals(SqlParser.parseStatementType("delete from test_table where num = 2").getType(), SqlParser.StatementType.DELETE);
33-
// assertEquals(SqlParser.parseStatementType("sElEcT 1 AS num").getType(), SqlParser.StatementType.SELECT);
34-
// assertEquals(SqlParser.parseStatementType(null).getType(), SqlParser.StatementType.OTHER);
35-
// assertEquals(SqlParser.parseStatementType("").getType(), SqlParser.StatementType.OTHER);
36-
// assertEquals(SqlParser.parseStatementType(" ").getType(), SqlParser.StatementType.OTHER);
37-
// }
38-
//
39-
// @Test(groups = {"integration"})
40-
// public void testParseStatementWithClause() throws Exception {
41-
// assertEquals(SqlParser.parseStatementType("with data as (SELECT number FROM numbers(100)) select * from data").getType(), SqlParser.StatementType.SELECT);
42-
// }
43-
4414
private SqlParserFacade parser;
4515

4616
public BaseSqlParserFacadeTest(String name) throws Exception {
@@ -353,9 +323,30 @@ public Object[][] testMiscStmtDp() {
353323
{"insert into t (i, t) values (1, timestamp '2010-01-01 00:00:00')", 0},
354324
{"insert into t (i, t) values (1, date '2010-01-01')", 0},
355325
{"SELECT timestamp '2010-01-01 00:00:00' as ts, date '2010-01-01' as d", 0},
326+
{INSERT_WITH_COMMENTS, 4},
327+
{" /* INSERT TESTING ?? */\n SELECT ? AS num", 1},
328+
{"/* SELECT ? TESTING */\n INSERT INTO test_table VALUES (?)", 1},
329+
{"/* INSERT ? T??ESTING */\n\n\n UPDATE test_table SET num = ?", 1},
330+
{"-- INSERT ? TESTING */\n SELECT ? AS num", 1},
331+
{" -- SELECT ? TESTING \n -- SELECT AGAIN ?\n INSERT INTO test_table VALUES (?)", 1},
332+
{" SELECT ? -- INSERT ? TESTING", 1},
333+
{"#! INSERT ? TESTING \n SELECT ? AS num", 1},
334+
{"#!INSERT ? TESTING \n SELECT ? AS num", 1},
335+
{"# INSERT ? TESTING \n SELECT ? AS num", 1},
336+
{"#INSERT ? TESTING \n SELECT ? AS num", 1},
337+
{"\nINSERT INTO TESTING \n SELECT ? AS num", 1},
338+
{" \n INSERT INTO TESTING \n SELECT ? AS num", 1},
339+
{" SELECT '##?0.1' as f, ? as a\n #this is debug \n FROM table", 1},
340+
{"WITH '#!?0.1' as f, ? as a\n #this is debug \n SELECT * FROM a", 1},
356341
};
357342
}
358343

344+
private static final String INSERT_WITH_COMMENTS = "-- line comment1 ?\n"
345+
+ "# line comment2 ?\n"
346+
+ "#! line comment3 ?\n"
347+
+ "/* block comment ? \n */"
348+
+ "INSERT INTO `with_complex_id`(`v?``1`, \"v?\"\"2\",`v?\\`3`, \"v?\\\"4\") VALUES (?, ?, ?, ?);";
349+
359350
private static final String INSERT_INLINE_DATA =
360351
"INSERT INTO `interval_15_XUTLZWBLKMNZZPRZSKRF`.`checkins` (`timestamp`, `id`) " +
361352
"VALUES ((`now64`(9) + INTERVAL -225 second), 1)";

0 commit comments

Comments
 (0)