Skip to content

Commit 3e18522

Browse files
committed
created a SQL parser facade to implement SQL parser selection
1 parent 0f04adf commit 3e18522

File tree

8 files changed

+323
-264
lines changed

8 files changed

+323
-264
lines changed

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/parser/ClickHouseSqlParserTest.java renamed to clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/parser/ClickHouseSqlParserFacadeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020

2121
import com.clickhouse.client.ClickHouseConfig;
2222

23-
public class ClickHouseSqlParserTest {
23+
public class ClickHouseSqlParserFacadeTest {
2424
private ClickHouseSqlStatement[] parse(String sql) {
2525
return ClickHouseSqlParser.parse(sql, new ClickHouseConfig());
2626
}
2727

2828
private String loadSql(String file) {
29-
InputStream inputStream = ClickHouseSqlParserTest.class.getResourceAsStream("/sqls/" + file);
29+
InputStream inputStream = ClickHouseSqlParserFacadeTest.class.getResourceAsStream("/sqls/" + file);
3030

3131
StringBuilder sql = new StringBuilder();
3232
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.clickhouse.jdbc.internal.FeatureManager;
1313
import com.clickhouse.jdbc.internal.JdbcConfiguration;
1414
import com.clickhouse.jdbc.internal.ParsedPreparedStatement;
15-
import com.clickhouse.jdbc.internal.SqlParser;
15+
import com.clickhouse.jdbc.internal.SqlParserFacade;
1616
import com.clickhouse.jdbc.metadata.DatabaseMetaDataImpl;
1717
import org.slf4j.Logger;
1818
import org.slf4j.LoggerFactory;
@@ -64,7 +64,7 @@ public class ConnectionImpl implements Connection, JdbcV2Wrapper {
6464
private final DatabaseMetaDataImpl metadata;
6565
protected final Calendar defaultCalendar;
6666

67-
private final SqlParser sqlParser;
67+
private final SqlParserFacade sqlParser;
6868

6969
private Executor networkTimeoutExecutor;
7070

@@ -117,7 +117,7 @@ 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 = new SqlParser();
120+
this.sqlParser = SqlParserFacade.getParser(SqlParserFacade.SQLParser.ANTLR4.name()); // TODO: path config string here
121121
this.featureManager = new FeatureManager(this.config);
122122
} catch (SQLException e) {
123123
throw e;
@@ -126,7 +126,7 @@ public ConnectionImpl(String url, Properties info) throws SQLException {
126126
}
127127
}
128128

129-
public SqlParser getSqlParser() {
129+
public SqlParserFacade getSqlParser() {
130130
return sqlParser;
131131
}
132132

Lines changed: 19 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
package com.clickhouse.jdbc.internal;
22

3-
import com.clickhouse.client.api.sql.SQLUtils;
4-
import com.clickhouse.jdbc.internal.parser.ClickHouseParser;
5-
import com.clickhouse.jdbc.internal.parser.ClickHouseParserBaseListener;
6-
import org.antlr.v4.runtime.tree.ErrorNode;
7-
import org.slf4j.Logger;
8-
import org.slf4j.LoggerFactory;
9-
10-
import java.util.ArrayList;
113
import java.util.Arrays;
12-
import java.util.Collections;
134
import java.util.List;
145

156
/**
16-
* Parser listener that collects information for prepared statement.
7+
* Model of parsed statement with parameters
178
*/
18-
public class ParsedPreparedStatement extends ClickHouseParserBaseListener {
19-
private static final Logger LOG = LoggerFactory.getLogger(ParsedPreparedStatement.class);
9+
public final class ParsedPreparedStatement {
2010

2111
private String table;
2212

@@ -78,10 +68,18 @@ public String[] getInsertColumns() {
7868
return insertColumns;
7969
}
8070

71+
public void setInsertColumns(String[] insertColumns) {
72+
this.insertColumns = insertColumns;
73+
}
74+
8175
public String getTable() {
8276
return table;
8377
}
8478

79+
public void setTable(String table) {
80+
this.table = table;
81+
}
82+
8583
public int[] getParamPositions() {
8684
return paramPositions;
8785
}
@@ -98,10 +96,18 @@ public int getAssignValuesListStartPosition() {
9896
return assignValuesListStartPosition;
9997
}
10098

99+
public void setAssignValuesListStartPosition(int assignValuesListStartPosition) {
100+
this.assignValuesListStartPosition = assignValuesListStartPosition;
101+
}
102+
101103
public int getAssignValuesListStopPosition() {
102104
return assignValuesListStopPosition;
103105
}
104106

107+
public void setAssignValuesListStopPosition(int assignValuesListStopPosition) {
108+
this.assignValuesListStopPosition = assignValuesListStopPosition;
109+
}
110+
105111
public void setUseDatabase(String useDatabase) {
106112
this.useDatabase = useDatabase;
107113
}
@@ -134,132 +140,11 @@ public void setHasErrors(boolean hasErrors) {
134140
this.hasErrors = hasErrors;
135141
}
136142

137-
@Override
138-
public void enterQueryStmt(ClickHouseParser.QueryStmtContext ctx) {
139-
if (SqlParser.isStmtWithResultSet(ctx)) {
140-
setHasResultSet(true);
141-
}
142-
}
143-
144-
@Override
145-
public void enterUseStmt(ClickHouseParser.UseStmtContext ctx) {
146-
if (ctx.databaseIdentifier() != null) {
147-
setUseDatabase(SQLUtils.unquoteIdentifier(ctx.databaseIdentifier().getText()));
148-
}
149-
}
150-
151-
@Override
152-
public void enterSetRoleStmt(ClickHouseParser.SetRoleStmtContext ctx) {
153-
if (ctx.NONE() != null) {
154-
setRoles(Collections.emptyList());
155-
} else {
156-
List<String> roles = new ArrayList<>();
157-
for (ClickHouseParser.IdentifierContext id : ctx.setRolesList().identifier()) {
158-
roles.add(SQLUtils.unquoteIdentifier(id.getText()));
159-
}
160-
setRoles(roles);
161-
}
162-
}
163-
164-
@Override
165-
public void enterColumnExprParam(ClickHouseParser.ColumnExprParamContext ctx) {
166-
appendParameter(ctx.start.getStartIndex());
167-
}
168-
169-
@Override
170-
public void enterColumnExprPrecedence3(ClickHouseParser.ColumnExprPrecedence3Context ctx) {
171-
super.enterColumnExprPrecedence3(ctx);
172-
}
173-
174-
@Override
175-
public void enterCteUnboundColParam(ClickHouseParser.CteUnboundColParamContext ctx) {
176-
appendParameter(ctx.start.getStartIndex());
177-
}
178-
179-
@Override
180-
public void visitErrorNode(ErrorNode node) {
181-
setHasErrors(true);
182-
}
183-
184-
@Override
185-
public void enterInsertParameterFuncExpr(ClickHouseParser.InsertParameterFuncExprContext ctx) {
186-
setUseFunction(true);
187-
}
188-
189-
@Override
190-
public void enterAssignmentValuesList(ClickHouseParser.AssignmentValuesListContext ctx) {
191-
assignValuesListStartPosition = ctx.getStart().getStartIndex();
192-
assignValuesListStopPosition = ctx.getStop().getStopIndex();
193-
}
194-
195-
@Override
196-
public void enterInsertParameter(ClickHouseParser.InsertParameterContext ctx) {
197-
appendParameter(ctx.start.getStartIndex());
198-
}
199-
200-
@Override
201-
public void enterFromClause(ClickHouseParser.FromClauseContext ctx) {
202-
if (ctx.JDBC_PARAM_PLACEHOLDER() != null) {
203-
appendParameter(ctx.JDBC_PARAM_PLACEHOLDER().getSymbol().getStartIndex());
204-
}
205-
}
206-
207-
@Override
208-
public void enterViewParam(ClickHouseParser.ViewParamContext ctx) {
209-
if (ctx.JDBC_PARAM_PLACEHOLDER() != null) {
210-
appendParameter(ctx.JDBC_PARAM_PLACEHOLDER().getSymbol().getStartIndex());
211-
}
212-
}
213-
214-
private void appendParameter(int startIndex) {
143+
void appendParameter(int startIndex) {
215144
argCount++;
216145
if (argCount > paramPositions.length) {
217146
paramPositions = Arrays.copyOf(paramPositions, paramPositions.length + 10);
218147
}
219148
paramPositions[argCount - 1] = startIndex;
220-
if (LOG.isTraceEnabled()) {
221-
LOG.trace("parameter position {}", startIndex);
222-
}
223-
}
224-
225-
@Override
226-
public void enterTableExprIdentifier(ClickHouseParser.TableExprIdentifierContext ctx) {
227-
if (ctx.tableIdentifier() != null) {
228-
this.table = SQLUtils.unquoteIdentifier(ctx.tableIdentifier().getText());
229-
}
230-
}
231-
232-
@Override
233-
public void enterInsertStmt(ClickHouseParser.InsertStmtContext ctx) {
234-
ClickHouseParser.TableIdentifierContext tableId = ctx.tableIdentifier();
235-
if (tableId != null) {
236-
this.table = SQLUtils.unquoteIdentifier(tableId.getText());
237-
}
238-
239-
ClickHouseParser.ColumnsClauseContext columns = ctx.columnsClause();
240-
if (columns != null) {
241-
List<ClickHouseParser.NestedIdentifierContext> names = columns.nestedIdentifier();
242-
this.insertColumns = new String[names.size()];
243-
for (int i = 0; i < names.size(); i++) {
244-
this.insertColumns[i] = names.get(i).getText();
245-
}
246-
}
247-
248-
setInsert(true);
249-
}
250-
251-
@Override
252-
public void enterDataClauseSelect(ClickHouseParser.DataClauseSelectContext ctx) {
253-
setInsertWithSelect(true);
254-
}
255-
256-
@Override
257-
public void enterDataClauseValues(ClickHouseParser.DataClauseValuesContext ctx) {
258-
setAssignValuesGroups(ctx.assignmentValues().size());
259-
}
260-
261-
@Override
262-
public void exitInsertParameterFuncExpr(ClickHouseParser.InsertParameterFuncExprContext ctx) {
263-
setUseFunction(true);
264149
}
265150
}
Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
package com.clickhouse.jdbc.internal;
22

3-
import com.clickhouse.client.api.sql.SQLUtils;
4-
import com.clickhouse.jdbc.internal.parser.ClickHouseParser;
5-
import com.clickhouse.jdbc.internal.parser.ClickHouseParserBaseListener;
6-
import org.antlr.v4.runtime.tree.ErrorNode;
7-
8-
import java.util.ArrayList;
9-
import java.util.Collections;
103
import java.util.List;
114

12-
public class ParsedStatement extends ClickHouseParserBaseListener {
5+
/**
6+
* Model of parsed statement when no parameters are used.
7+
*/
8+
public final class ParsedStatement {
139

1410
private String useDatabase;
1511

1612
private boolean hasResultSet;
1713

1814
private boolean insert;
1915

20-
private String insertTableId;
21-
2216
private List<String> roles;
2317

2418
private boolean hasErrors;
@@ -43,14 +37,6 @@ public boolean isInsert() {
4337
return insert;
4438
}
4539

46-
public void setInsertTableId(String insertTableId) {
47-
this.insertTableId = insertTableId;
48-
}
49-
50-
public String getInsertTableId() {
51-
return insertTableId;
52-
}
53-
5440
public String getUseDatabase() {
5541
return useDatabase;
5642
}
@@ -70,38 +56,4 @@ public boolean isHasErrors() {
7056
public void setHasErrors(boolean hasErrors) {
7157
this.hasErrors = hasErrors;
7258
}
73-
74-
@Override
75-
public void visitErrorNode(ErrorNode node) {
76-
setHasErrors(true);
77-
}
78-
79-
@Override
80-
public void enterQueryStmt(ClickHouseParser.QueryStmtContext ctx) {
81-
if (SqlParser.isStmtWithResultSet(ctx)) {
82-
setHasResultSet(true);
83-
}
84-
}
85-
86-
@Override
87-
public void enterUseStmt(ClickHouseParser.UseStmtContext ctx) {
88-
if (ctx.databaseIdentifier() != null) {
89-
setUseDatabase(SQLUtils.unquoteIdentifier(ctx.databaseIdentifier().getText()));
90-
}
91-
}
92-
93-
@Override
94-
public void enterSetRoleStmt(ClickHouseParser.SetRoleStmtContext ctx) {
95-
if (ctx.NONE() != null) {
96-
setRoles(Collections.emptyList());
97-
} else {
98-
List<String> roles = new ArrayList<>();
99-
for (ClickHouseParser.IdentifierContext id : ctx.setRolesList().identifier()) {
100-
roles.add(SQLUtils.unquoteIdentifier(id.getText()));
101-
}
102-
setRoles(roles);
103-
}
104-
}
105-
106-
10759
}

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

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)