Skip to content

Commit eb0762f

Browse files
committed
Reworked some schema staff
1 parent fea9b35 commit eb0762f

File tree

3 files changed

+105
-32
lines changed

3 files changed

+105
-32
lines changed

client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package com.clickhouse.client.api.metadata;
22

33
import com.clickhouse.data.ClickHouseColumn;
4+
import com.clickhouse.data.ClickHouseDataType;
45
import com.google.common.collect.ImmutableList;
56
import com.google.common.collect.ImmutableMap;
67

7-
import java.util.ArrayList;
8-
import java.util.Collection;
9-
import java.util.Collections;
10-
import java.util.HashMap;
11-
import java.util.List;
12-
import java.util.Map;
8+
import java.util.*;
139

1410
public class TableSchema {
1511

@@ -129,5 +125,16 @@ public String toString() {
129125
", hasDefaults=" + hasDefaults +
130126
'}';
131127
}
128+
129+
public static final Collection<ClickHouseColumn> SIMPLE_SHOW_STMT_SCHEMA =
130+
Collections.unmodifiableCollection(Arrays.asList(ClickHouseColumn.of("name", ClickHouseDataType.String.name())));
131+
132+
public static final Collection<ClickHouseColumn> SHOW_TABLES_SCHEMA = SIMPLE_SHOW_STMT_SCHEMA;
133+
public static final Collection<ClickHouseColumn> SHOW_DATABASES_SCHEMA = SIMPLE_SHOW_STMT_SCHEMA;
134+
public static final Collection<ClickHouseColumn> SHOW_DICTIONARIES_SCHEMA = SIMPLE_SHOW_STMT_SCHEMA;
135+
public static final Collection<ClickHouseColumn> SHOW_USERS_SCHEMA = SIMPLE_SHOW_STMT_SCHEMA;
136+
public static final Collection<ClickHouseColumn> SHOW_ROLES_SCHEMA = SIMPLE_SHOW_STMT_SCHEMA;
137+
public static final Collection<ClickHouseColumn> SHOW_GRANTS_SCHEMA = Collections.unmodifiableCollection(Arrays.asList(ClickHouseColumn.of("GRANTS", ClickHouseDataType.String.name())));
138+
132139
}
133140

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public class PreparedStatementImpl extends StatementImpl implements PreparedStat
6262
Object [] parameters;
6363
String insertIntoSQL;
6464

65+
ShowStatementType showStatementType;
66+
6567
StatementType statementType;
6668

6769
private final ParameterMetaData parameterMetaData;
@@ -73,11 +75,17 @@ public PreparedStatementImpl(ConnectionImpl connection, String sql) throws SQLEx
7375
this.originalSql = sql.trim();
7476
//Split the sql string into an array of strings around question mark tokens
7577
this.sqlSegments = originalSql.split("\\?");
76-
this.statementType = parseStatementType(originalSql);
77-
78-
if (statementType == StatementType.INSERT) {
79-
insertIntoSQL = originalSql.substring(0, originalSql.indexOf("VALUES") + 6);
80-
valueSegments = originalSql.substring(originalSql.indexOf("VALUES") + 6).split("\\?");
78+
Object[] parseResult = parseStatement(originalSql);
79+
this.statementType = (StatementType) parseResult[0];
80+
81+
switch (statementType) {
82+
case INSERT:
83+
insertIntoSQL = originalSql.substring(0, originalSql.indexOf("VALUES") + 6);
84+
valueSegments = originalSql.substring(originalSql.indexOf("VALUES") + 6).split("\\?");
85+
break;
86+
case SHOW:
87+
showStatementType = (ShowStatementType) parseResult[1];
88+
break;
8189
}
8290

8391
//Create an array of objects to store the parameters
@@ -322,7 +330,7 @@ public ResultSetMetaData getMetaData() throws SQLException {
322330
// fallback to empty until
323331
}
324332
} else if (statementType == StatementType.SHOW) {
325-
// predefined
333+
// predefined (it can be different for different objects)
326334
} else if (statementType == StatementType.DESCRIBE) {
327335
// predefined
328336
} else {

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

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,31 @@ protected enum StatementType {
6060
SELECT, INSERT, DELETE, UPDATE, CREATE, DROP, ALTER, TRUNCATE, USE, SHOW, DESCRIBE, EXPLAIN, SET, KILL, OTHER, INSERT_INTO_SELECT
6161
}
6262

63+
protected enum ShowStatementType {
64+
TABLES, USERS, PROCESSLIST
65+
}
66+
6367
protected static StatementType parseStatementType(String sql) {
68+
return (StatementType) parseStatement(sql)[0];
69+
}
70+
71+
private static final Object[] OTHER_STMT_TYPE_RESULT = new Object[] {StatementType.OTHER};
72+
73+
/**
74+
* Returns non-empty array with at list StatementType on position 0.
75+
* If Show statement - returns rest token from the statement.
76+
*
77+
* @param sql - raw SQL statement
78+
* @return Object[] - parse result
79+
*/
80+
public static Object[] parseStatement(String sql) {
6481
if (sql == null) {
65-
return StatementType.OTHER;
82+
return OTHER_STMT_TYPE_RESULT;
6683
}
6784

6885
String trimmedSql = sql.trim();
6986
if (trimmedSql.isEmpty()) {
70-
return StatementType.OTHER;
87+
return OTHER_STMT_TYPE_RESULT;
7188
}
7289

7390
trimmedSql = trimmedSql.replaceAll("/\\*.*?\\*/", "").trim(); // remove comments
@@ -81,34 +98,75 @@ protected static StatementType parseStatementType(String sql) {
8198
continue;
8299
}
83100

101+
StatementType statementType = null;
102+
Object[] parseResult = null;
84103
switch (tokens[0].toUpperCase()) {
85-
case "SELECT": return StatementType.SELECT;
86-
case "WITH": return StatementType.SELECT;
104+
case "SELECT":
105+
statementType = StatementType.SELECT;
106+
break;
107+
case "WITH":
108+
statementType = StatementType.SELECT;
109+
break;
87110
case "INSERT":
111+
statementType = StatementType.INSERT;
88112
for (String token : tokens) {
89113
if (token.equalsIgnoreCase("SELECT")) {
90-
return StatementType.INSERT_INTO_SELECT;
114+
statementType = StatementType.INSERT_INTO_SELECT;
115+
}
116+
}
117+
break;
118+
case "DELETE":
119+
statementType = StatementType.DELETE;
120+
break;
121+
case "UPDATE":
122+
statementType = StatementType.UPDATE;
123+
break;
124+
case "CREATE":
125+
statementType = StatementType.CREATE;
126+
break;
127+
case "DROP":
128+
statementType = StatementType.DROP;
129+
break;
130+
case "ALTER":
131+
statementType = StatementType.ALTER;
132+
break;
133+
case "TRUNCATE":
134+
statementType = StatementType.TRUNCATE;
135+
break;
136+
case "USE":
137+
statementType = StatementType.USE;
138+
break;
139+
case "SHOW":
140+
statementType = StatementType.SHOW;
141+
ShowStatementType showStatementType = null;
142+
for (String token : tokens) {
143+
if (!token.isEmpty()) {
144+
showStatementType = ShowStatementType.valueOf(token.toUpperCase());
145+
break;
91146
}
92147
}
93-
return StatementType.INSERT;
94-
case "DELETE": return StatementType.DELETE;
95-
case "UPDATE": return StatementType.UPDATE;
96-
case "CREATE": return StatementType.CREATE;
97-
case "DROP": return StatementType.DROP;
98-
case "ALTER": return StatementType.ALTER;
99-
case "TRUNCATE": return StatementType.TRUNCATE;
100-
case "USE": return StatementType.USE;
101-
case "SHOW": return StatementType.SHOW;
102-
case "DESCRIBE": return StatementType.DESCRIBE;
103-
case "EXPLAIN": return StatementType.EXPLAIN;
104-
case "SET": return StatementType.SET;
105-
case "KILL": return StatementType.KILL;
106-
default: return StatementType.OTHER;
148+
parseResult = new Object[] {statementType, showStatementType};
149+
break;
150+
case "DESCRIBE":
151+
statementType = StatementType.DESCRIBE;
152+
break;
153+
case "EXPLAIN":
154+
statementType = StatementType.EXPLAIN;
155+
break;
156+
case "SET":
157+
statementType = StatementType.SET;
158+
break;
159+
case "KILL":
160+
statementType = StatementType.KILL;
161+
break;
162+
default:
163+
parseResult = OTHER_STMT_TYPE_RESULT;
107164
}
165+
return parseResult == null ? new Object[] {statementType} : parseResult;
108166
}
109167
}
110168

111-
return StatementType.OTHER;
169+
return OTHER_STMT_TYPE_RESULT;
112170
}
113171

114172
protected static String parseTableName(String sql) {

0 commit comments

Comments
 (0)