Skip to content

Commit 9d8fb28

Browse files
authored
Merge pull request #2048 from ClickHouse/adjust-roles-parsing
Adjust roles parsing
2 parents e489e7a + 633a3ce commit 9d8fb28

File tree

4 files changed

+52
-11
lines changed

4 files changed

+52
-11
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,11 @@ private boolean execute(String sql, QuerySettings settings) throws SQLException
309309
int roleIndex = JdbcUtils.indexOfIgnoresCase(tokens, "ROLE");
310310
if (roleIndex == 1) {
311311
for (int i = 2; i < tokens.size(); i++) {
312-
roles.add(tokens.get(i));
312+
String token = tokens.get(i);
313+
String[] roleTokens = token.split(",");
314+
for (String roleToken : roleTokens) {
315+
roles.add(roleToken.replace("\"", ""));//Remove double quotes
316+
}
313317
}
314318

315319
if (JdbcUtils.containsIgnoresCase(roles, "NONE")) {

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,36 @@ public static String generateSqlTypeEnum(String columnName) {
6363

6464
public static List<String> tokenizeSQL(String sql) {
6565
List<String> tokens = new ArrayList<>();
66-
Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(sql);
67-
while (m.find()) {
68-
String token = m.group(1).replace("\"", "").trim();
69-
if (!token.isEmpty() && token.charAt(token.length() - 1) == ',') {
70-
token = token.substring(0, token.length() - 1);
71-
}
7266

73-
if (!isBlank(token)) {
74-
tokens.add(token);
67+
// Remove SQL comments
68+
String withoutComments = sql
69+
.replaceAll("--.*?$", "") // Remove single-line comments
70+
.replaceAll("/\\*.*?\\*/", ""); // Remove multi-line comments
71+
72+
StringBuilder currentToken = new StringBuilder();
73+
boolean insideQuotes = false;
74+
75+
for (int i = 0; i < withoutComments.length(); i++) {
76+
char c = withoutComments.charAt(i);
77+
78+
if (c == '"') {
79+
insideQuotes = !insideQuotes; // Toggle the insideQuotes flag
80+
currentToken.append(c); // Include the quote in the token
81+
} else if (Character.isWhitespace(c) && !insideQuotes) {
82+
if (currentToken.length() > 0) {
83+
tokens.add(currentToken.toString());
84+
currentToken.setLength(0); // Clear the current token
85+
}
86+
} else {
87+
currentToken.append(c);
7588
}
7689
}
7790

91+
// Add the last token if it exists
92+
if (currentToken.length() > 0) {
93+
tokens.add(currentToken.toString());
94+
}
95+
7896
return tokens;
7997
}
8098

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ private void testSettingRole() throws SQLException {
345345
return;
346346
}
347347

348-
List<String> roles = Arrays.asList("role1", "role2");
348+
List<String> roles = Arrays.asList("role1", "role2", "role3");
349349

350350
try (ConnectionImpl conn = (ConnectionImpl) getJdbcConnection()) {
351351
try (Statement stmt = conn.createStatement()) {
@@ -388,6 +388,25 @@ record = conn.client.queryAll("SELECT currentRoles()").get(0);
388388

389389
record = conn.client.queryAll("SELECT currentRoles()").get(0);
390390
assertEquals(record.getList(1).size(), 0);
391+
392+
try (Statement stmt = conn.createStatement()) {
393+
stmt.execute("SET ROLE \"role1\",\"role2\"");
394+
}
395+
396+
record = conn.client.queryAll("SELECT currentRoles()").get(0);
397+
assertEquals(record.getList(1).size(), 2);
398+
assertEquals(record.getList(1).get(0), "role1");
399+
assertEquals(record.getList(1).get(1), "role2");
400+
401+
try (Statement stmt = conn.createStatement()) {
402+
stmt.execute("SET ROLE \"role1\",\"role2\",\"role3\"");
403+
}
404+
405+
record = conn.client.queryAll("SELECT currentRoles()").get(0);
406+
assertEquals(record.getList(1).size(), 3);
407+
assertEquals(record.getList(1).get(0), "role1");
408+
assertEquals(record.getList(1).get(1), "role2");
409+
assertEquals(record.getList(1).get(2), "role3");
391410
}
392411
}
393412

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ public void testTokenizeSQL() {
4646
assertEquals(tokens3.get(2), "FROM");
4747
assertEquals(tokens3.get(3), "table");
4848
assertEquals(tokens3.get(4), "WHERE");
49-
assertEquals(tokens3.get(5), "id = 1 AND name = 'John' OR age = 30");
49+
assertEquals(tokens3.get(5).replace("\"", ""), "id = 1 AND name = 'John' OR age = 30");
5050
}
5151
}

0 commit comments

Comments
 (0)