Skip to content

Commit 020e4cc

Browse files
committed
fixed detecting different insert types
1 parent 68b8dd4 commit 020e4cc

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,8 @@ public PreparedStatement prepareStatement(String sql, int resultSetType, int res
387387
* - INSERT INTO t VALUES (now(), ?, 1), (now(), ?, 2) !# multiple values list
388388
* - INSERT INTO t SELECT ?, ?, ? !# insert from select
389389
*/
390-
if (!parsedStatement.isInsertWithSelect()) {
390+
if (!parsedStatement.isInsertWithSelect() && parsedStatement.getAssignValuesGroups() == 1
391+
&& !parsedStatement.isUseFunction()) {
391392
TableSchema tableSchema = client.getTableSchema(parsedStatement.getTable(), schema);
392393
return new WriterStatementImpl(this, sql, tableSchema, parsedStatement);
393394
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public PreparedStatementImpl(ConnectionImpl connection, String sql, ParsedPrepar
9292

9393
int valueListStartPos = parsedStatement.getAssignValuesListStartPosition();
9494
int valueListStopPos = parsedStatement.getAssignValuesListStopPosition();
95-
if (valueListStartPos > -1 && valueListStopPos > -1) {
95+
if (parsedStatement.getAssignValuesGroups() == 1 && valueListStartPos > -1 && valueListStopPos > -1) {
9696
int[] positions = parsedStatement.getParamPositions();
9797
paramPositionsInDataClause = new int[argCount];
9898
for (int i = 0; i < argCount; i++) {

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class ParsedPreparedStatement extends ClickHouseParserBaseListener {
2222

2323
private String[] insertColumns;
2424

25-
private boolean hasFuncWrappedParameter;
25+
private boolean useFunction;
2626

2727
private boolean hasErrors;
2828

@@ -42,6 +42,8 @@ public class ParsedPreparedStatement extends ClickHouseParserBaseListener {
4242

4343
private int assignValuesListStopPosition = -1;
4444

45+
private int assignValuesGroups = -1;
46+
4547
public void setHasResultSet(boolean hasResultSet) {
4648
this.hasResultSet = hasResultSet;
4749
}
@@ -110,6 +112,22 @@ public String getUseDatabase() {
110112
return useDatabase;
111113
}
112114

115+
public void setAssignValuesGroups(int assignValuesGroups) {
116+
this.assignValuesGroups = assignValuesGroups;
117+
}
118+
119+
public int getAssignValuesGroups() {
120+
return assignValuesGroups;
121+
}
122+
123+
public boolean isUseFunction() {
124+
return useFunction;
125+
}
126+
127+
public void setUseFunction(boolean useFunction) {
128+
this.useFunction = useFunction;
129+
}
130+
113131
@Override
114132
public void enterQueryStmt(ClickHouseParser.QueryStmtContext ctx) {
115133
ClickHouseParser.QueryContext qCtx = ctx.query();
@@ -153,7 +171,7 @@ public void visitErrorNode(ErrorNode node) {
153171

154172
@Override
155173
public void enterInsertParameterFuncExpr(ClickHouseParser.InsertParameterFuncExprContext ctx) {
156-
hasFuncWrappedParameter = true;
174+
useFunction = true;
157175
}
158176

159177
@Override
@@ -201,4 +219,14 @@ public void enterInsertStmt(ClickHouseParser.InsertStmtContext ctx) {
201219
public void enterDataClauseSelect(ClickHouseParser.DataClauseSelectContext ctx) {
202220
setInsertWithSelect(true);
203221
}
222+
223+
@Override
224+
public void enterDataClauseValues(ClickHouseParser.DataClauseValuesContext ctx) {
225+
setAssignValuesGroups(ctx.assignmentValues().size());
226+
}
227+
228+
@Override
229+
public void exitInsertParameterFuncExpr(ClickHouseParser.InsertParameterFuncExprContext ctx) {
230+
setUseFunction(true);
231+
}
204232
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public void testPreparedStatementInsertSQL() {
142142
assertTrue(parsed.isInsert());
143143
assertFalse(parsed.isHasResultSet());
144144
assertFalse(parsed.isInsertWithSelect());
145+
assertEquals(parsed.getAssignValuesGroups(), 3);
145146

146147
sql = "-- line comment1 ?\n"
147148
+ "# line comment2 ?\n"
@@ -153,6 +154,7 @@ public void testPreparedStatementInsertSQL() {
153154
assertTrue(parsed.isInsert());
154155
assertFalse(parsed.isHasResultSet());
155156
assertFalse(parsed.isInsertWithSelect());
157+
assertEquals(parsed.getAssignValuesGroups(), 1);
156158

157159
sql = "INSERT INTO tt SELECT now(), 10, 20.0, 30";
158160
parsed = parser.parsePreparedStatement(sql);
@@ -169,5 +171,6 @@ public void testPreparedStatementInsertSQL() {
169171
assertTrue(parsed.isInsert());
170172
assertFalse(parsed.isHasResultSet());
171173
assertFalse(parsed.isInsertWithSelect());
174+
assertEquals(parsed.getAssignValuesGroups(), 1);
172175
}
173176
}

0 commit comments

Comments
 (0)