Skip to content

Commit 36cad37

Browse files
authored
Merge pull request #2019 from ClickHouse/sql-comment-parsing
Cleanup sql comments when detecting type
2 parents 0b7a240 + 22bbd74 commit 36cad37

File tree

2 files changed

+63
-20
lines changed

2 files changed

+63
-20
lines changed

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

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,32 +57,51 @@ protected enum StatementType {
5757
SELECT, INSERT, DELETE, UPDATE, CREATE, DROP, ALTER, TRUNCATE, USE, SHOW, DESCRIBE, EXPLAIN, SET, KILL, OTHER
5858
}
5959

60-
protected StatementType parseStatementType(String sql) {
61-
String[] tokens = sql.trim().split("\\s+");
62-
if (tokens.length == 0) {
60+
protected static StatementType parseStatementType(String sql) {
61+
if (sql == null) {
6362
return StatementType.OTHER;
6463
}
6564

66-
switch (tokens[0].toUpperCase()) {
67-
case "SELECT": return StatementType.SELECT;
68-
case "INSERT": return StatementType.INSERT;
69-
case "DELETE": return StatementType.DELETE;
70-
case "UPDATE": return StatementType.UPDATE;
71-
case "CREATE": return StatementType.CREATE;
72-
case "DROP": return StatementType.DROP;
73-
case "ALTER": return StatementType.ALTER;
74-
case "TRUNCATE": return StatementType.TRUNCATE;
75-
case "USE": return StatementType.USE;
76-
case "SHOW": return StatementType.SHOW;
77-
case "DESCRIBE": return StatementType.DESCRIBE;
78-
case "EXPLAIN": return StatementType.EXPLAIN;
79-
case "SET": return StatementType.SET;
80-
case "KILL": return StatementType.KILL;
81-
default: return StatementType.OTHER;
65+
String trimmedSql = sql.trim();
66+
if (trimmedSql.isEmpty()) {
67+
return StatementType.OTHER;
8268
}
69+
70+
trimmedSql = trimmedSql.replaceAll("/\\*.*?\\*/", "").trim(); // remove comments
71+
String[] lines = trimmedSql.split("\n");
72+
for (String line : lines) {
73+
String trimmedLine = line.trim();
74+
//https://clickhouse.com/docs/en/sql-reference/syntax#comments
75+
if (!trimmedLine.startsWith("--") && !trimmedLine.startsWith("#!") && !trimmedLine.startsWith("#")) {
76+
String[] tokens = trimmedLine.split("\\s+");
77+
if (tokens.length == 0) {
78+
continue;
79+
}
80+
81+
switch (tokens[0].toUpperCase()) {
82+
case "SELECT": return StatementType.SELECT;
83+
case "INSERT": return StatementType.INSERT;
84+
case "DELETE": return StatementType.DELETE;
85+
case "UPDATE": return StatementType.UPDATE;
86+
case "CREATE": return StatementType.CREATE;
87+
case "DROP": return StatementType.DROP;
88+
case "ALTER": return StatementType.ALTER;
89+
case "TRUNCATE": return StatementType.TRUNCATE;
90+
case "USE": return StatementType.USE;
91+
case "SHOW": return StatementType.SHOW;
92+
case "DESCRIBE": return StatementType.DESCRIBE;
93+
case "EXPLAIN": return StatementType.EXPLAIN;
94+
case "SET": return StatementType.SET;
95+
case "KILL": return StatementType.KILL;
96+
default: return StatementType.OTHER;
97+
}
98+
}
99+
}
100+
101+
return StatementType.OTHER;
83102
}
84103

85-
protected String parseTableName(String sql) {
104+
protected static String parseTableName(String sql) {
86105
String[] tokens = sql.trim().split("\\s+");
87106
if (tokens.length < 3) {
88107
return null;

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,28 @@ public void testGettingArrays() throws Exception {
404404
assertEquals(Arrays.stream(((Object[]) stringArray.getArray())).toList(), Arrays.asList("val1", "val2", "val3"));
405405
}
406406
}
407+
408+
@Test(groups = { "integration" })
409+
public void testWithComments() throws Exception {
410+
assertEquals(StatementImpl.parseStatementType(" /* INSERT TESTING */\n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
411+
assertEquals(StatementImpl.parseStatementType("/* SELECT TESTING */\n INSERT INTO test_table VALUES (1)"), StatementImpl.StatementType.INSERT);
412+
assertEquals(StatementImpl.parseStatementType("/* INSERT TESTING */\n\n\n UPDATE test_table SET num = 2"), StatementImpl.StatementType.UPDATE);
413+
assertEquals(StatementImpl.parseStatementType("-- INSERT TESTING */\n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
414+
assertEquals(StatementImpl.parseStatementType(" -- SELECT TESTING \n -- SELECT AGAIN \n INSERT INTO test_table VALUES (1)"), StatementImpl.StatementType.INSERT);
415+
assertEquals(StatementImpl.parseStatementType(" SELECT 42 -- INSERT TESTING"), StatementImpl.StatementType.SELECT);
416+
assertEquals(StatementImpl.parseStatementType("#! INSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
417+
assertEquals(StatementImpl.parseStatementType("#!INSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
418+
assertEquals(StatementImpl.parseStatementType("# INSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
419+
assertEquals(StatementImpl.parseStatementType("#INSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.SELECT);
420+
assertEquals(StatementImpl.parseStatementType("\nINSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.INSERT);
421+
assertEquals(StatementImpl.parseStatementType(" \n INSERT TESTING \n SELECT 1 AS num"), StatementImpl.StatementType.INSERT);
422+
assertEquals(StatementImpl.parseStatementType("select 1 AS num"), StatementImpl.StatementType.SELECT);
423+
assertEquals(StatementImpl.parseStatementType("insert into test_table values (1)"), StatementImpl.StatementType.INSERT);
424+
assertEquals(StatementImpl.parseStatementType("update test_table set num = 2"), StatementImpl.StatementType.UPDATE);
425+
assertEquals(StatementImpl.parseStatementType("delete from test_table where num = 2"), StatementImpl.StatementType.DELETE);
426+
assertEquals(StatementImpl.parseStatementType("sElEcT 1 AS num"), StatementImpl.StatementType.SELECT);
427+
assertEquals(StatementImpl.parseStatementType(null), StatementImpl.StatementType.OTHER);
428+
assertEquals(StatementImpl.parseStatementType(""), StatementImpl.StatementType.OTHER);
429+
assertEquals(StatementImpl.parseStatementType(" "), StatementImpl.StatementType.OTHER);
430+
}
407431
}

0 commit comments

Comments
 (0)