Skip to content

Commit b773b7e

Browse files
committed
fixed problem with detecting function in insert statement
1 parent 2b108b0 commit b773b7e

File tree

6 files changed

+29
-24
lines changed

6 files changed

+29
-24
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ public enum DriverProperties {
6666
* <li>JAVACC - parser extracts required information but PreparedStatement parameters parsed separately.</li>
6767
* </ul>
6868
*/
69-
// SQL_PARSER("jdbc_sql_parser", "JAVACC", List.of("ANTLR4", "ANTLR4_PARAMS_PARSER", "JAVACC")),
70-
SQL_PARSER("jdbc_sql_parser", "ANTLR4", List.of("ANTLR4", "ANTLR4_PARAMS_PARSER", "JAVACC")),
69+
SQL_PARSER("jdbc_sql_parser", "JAVACC", List.of("ANTLR4", "ANTLR4_PARAMS_PARSER", "JAVACC")),
7170
;
7271

7372

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public ParsedPreparedStatement parsePreparedStatement(String sql) {
107107
}
108108
}
109109

110-
stmt.setUseFunction(false);
110+
stmt.setUseFunction(parsedStmt.isFuncUsed());
111111
parseParameters(sql, stmt);
112112
return stmt;
113113
}

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/parser/javacc/ClickHouseSqlStatement.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,20 @@ public class ClickHouseSqlStatement {
4545
private final Map<String, String> settings;
4646
private final Set<String> tempTables;
4747
private final int valueGroups;
48+
private final boolean funcUsed;
4849

4950
public ClickHouseSqlStatement(String sql) {
50-
this(sql, StatementType.UNKNOWN, null, null, null, null, null, null, null, null, null, null, null, null, 0);
51+
this(sql, StatementType.UNKNOWN, null, null, null, null, null, null, null, null, null, null, null, null,0, false);
5152
}
5253

5354
public ClickHouseSqlStatement(String sql, StatementType stmtType) {
54-
this(sql, stmtType, null, null, null, null, null, null, null, null, null, null, null, null, 0);
55+
this(sql, stmtType, null, null, null, null, null, null, null, null, null, null, null, null, 0, false);
5556
}
5657

5758
public ClickHouseSqlStatement(String sql, StatementType stmtType, String cluster, String database, String table,
5859
String input, String compressAlgorithm, String compressLevel, String format, String file,
5960
List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
60-
Set<String> tempTables, int valueGroups) {
61+
Set<String> tempTables, int valueGroups, boolean funcUsed) {
6162
this.sql = sql;
6263
this.stmtType = stmtType;
6364

@@ -70,6 +71,7 @@ public ClickHouseSqlStatement(String sql, StatementType stmtType, String cluster
7071
this.format = format;
7172
this.file = file;
7273
this.valueGroups = valueGroups;
74+
this.funcUsed = funcUsed;
7375

7476
if (parameters != null && !parameters.isEmpty()) {
7577
this.parameters = Collections.unmodifiableList(parameters);
@@ -144,6 +146,10 @@ public boolean isTCL() {
144146
return this.stmtType.getLanguageType() == LanguageType.TCL;
145147
}
146148

149+
public boolean isFuncUsed() {
150+
return funcUsed;
151+
}
152+
147153
public boolean isIdemponent() {
148154
boolean result = this.stmtType.isIdempotent() && !this.hasFile();
149155

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/parser/javacc/JdbcParseHandler.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.clickhouse.data.ClickHouseFormat;
66
import com.clickhouse.data.ClickHouseUtils;
77

8-
98
import java.util.List;
109
import java.util.Map;
1110
import java.util.Set;
@@ -52,7 +51,7 @@ private void addMutationSetting(String sql, StringBuilder builder, Map<String, I
5251
private ClickHouseSqlStatement handleDelete(String sql, StatementType stmtType, String cluster, String database,
5352
String table, String input, String compressAlgorithm, String compressLevel, String format, String file,
5453
List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
55-
Set<String> tempTables) {
54+
Set<String> tempTables, boolean funcUsed) {
5655
StringBuilder builder = new StringBuilder();
5756
int index = positions.get("DELETE");
5857
if (index > 0) {
@@ -71,13 +70,13 @@ private ClickHouseSqlStatement handleDelete(String sql, StatementType stmtType,
7170
builder.append("TRUNCATE TABLE").append(sql.substring(index + 4));
7271
}
7372
return new ClickHouseSqlStatement(builder.toString(), stmtType, cluster, database, table, input,
74-
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0);
73+
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0, funcUsed);
7574
}
7675

7776
private ClickHouseSqlStatement handleUpdate(String sql, StatementType stmtType, String cluster, String database,
7877
String table, String input, String compressAlgorithm, String compressLevel, String format, String file,
7978
List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
80-
Set<String> tempTables) {
79+
Set<String> tempTables, boolean funcUsed) {
8180
StringBuilder builder = new StringBuilder();
8281
int index = positions.get("UPDATE");
8382
if (index > 0) {
@@ -91,13 +90,13 @@ private ClickHouseSqlStatement handleUpdate(String sql, StatementType stmtType,
9190
builder.append('`').append(table).append('`').append(" UPDATE"); // .append(sql.substring(index + 3));
9291
addMutationSetting(sql, builder, positions, settings, index + 3);
9392
return new ClickHouseSqlStatement(builder.toString(), stmtType, cluster, database, table, input,
94-
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0);
93+
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0, funcUsed);
9594
}
9695

9796
private ClickHouseSqlStatement handleInFileForInsertQuery(String sql, StatementType stmtType, String cluster,
9897
String database, String table, String input, String compressAlgorithm, String compressLevel, String format,
9998
String file, List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
100-
Set<String> tempTables, int valueGroups) {
99+
Set<String> tempTables, int valueGroups, boolean funcUsed) {
101100
StringBuilder builder = new StringBuilder(sql.length());
102101
builder.append(sql.substring(0, positions.get("FROM")));
103102
Integer index = positions.get("SETTINGS");
@@ -115,44 +114,44 @@ private ClickHouseSqlStatement handleInFileForInsertQuery(String sql, StatementT
115114
builder.append("FORMAT ").append(format);
116115
}
117116
return new ClickHouseSqlStatement(builder.toString(), stmtType, cluster, database, table, input,
118-
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, valueGroups);
117+
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, valueGroups, funcUsed);
119118
}
120119

121120
private ClickHouseSqlStatement handleOutFileForSelectQuery(String sql, StatementType stmtType, String cluster,
122121
String database, String table, String input, String compressAlgorithm, String compressLevel, String format,
123122
String file, List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
124-
Set<String> tempTables) {
123+
Set<String> tempTables, boolean funcUsed) {
125124
StringBuilder builder = new StringBuilder(sql.length());
126125
builder.append(sql.substring(0, positions.get("INTO")));
127126
Integer index = positions.get("FORMAT");
128127
if (index != null && index > 0) {
129128
builder.append(sql.substring(index));
130129
}
131130
return new ClickHouseSqlStatement(builder.toString(), stmtType, cluster, database, table, input,
132-
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0);
131+
compressAlgorithm, compressLevel, format, file, parameters, null, settings, null, 0, funcUsed);
133132
}
134133

135134
@Override
136135
public ClickHouseSqlStatement handleStatement(String sql, StatementType stmtType, String cluster, String database,
137136
String table, String input, String compressAlgorithm, String compressLevel, String format, String file,
138137
List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
139-
Set<String> tempTables, int valueGroups) {
138+
Set<String> tempTables, int valueGroups, boolean funcUsed) {
140139
boolean hasFile = allowLocalFile && !ClickHouseChecker.isNullOrEmpty(file) && file.charAt(0) == '\'';
141140
ClickHouseSqlStatement s = null;
142141
if (stmtType == StatementType.DELETE) {
143142
s = allowLightWeightDelete ? s
144143
: handleDelete(sql, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel,
145-
format, file, parameters, positions, settings, tempTables);
144+
format, file, parameters, positions, settings, tempTables, funcUsed);
146145
} else if (stmtType == StatementType.UPDATE) {
147146
s = allowLightWeightUpdate ? s
148147
: handleUpdate(sql, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel,
149-
format, file, parameters, positions, settings, tempTables);
148+
format, file, parameters, positions, settings, tempTables, funcUsed);
150149
} else if (stmtType == StatementType.INSERT && hasFile) {
151150
s = handleInFileForInsertQuery(sql, stmtType, cluster, database, table, input, compressAlgorithm,
152-
compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups);
151+
compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups, funcUsed);
153152
} else if (stmtType == StatementType.SELECT && hasFile) {
154153
s = handleOutFileForSelectQuery(sql, stmtType, cluster, database, table, input, compressAlgorithm,
155-
compressLevel, format, file, parameters, positions, settings, tempTables);
154+
compressLevel, format, file, parameters, positions, settings, tempTables, funcUsed);
156155
}
157156
return s;
158157
}

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/parser/javacc/ParseHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public String handleParameter(String cluster, String database, String table, int
5252
public ClickHouseSqlStatement handleStatement(String sql, StatementType stmtType, String cluster, String database,
5353
String table, String input, String compressAlgorithm, String compressLevel, String format, String file,
5454
List<Integer> parameters, Map<String, Integer> positions, Map<String, String> settings,
55-
Set<String> tempTables, int valueGroup) {
55+
Set<String> tempTables, int valueGroup, boolean funcUsed) {
5656
return null;
5757
}
5858
}

jdbc-v2/src/main/javacc/ClickHouseSqlParser.jj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ TOKEN_MGR_DECLS: {
175175
String format = null;
176176
String file = null;
177177
int valueGroups = 0;
178+
boolean funcUsed = false;
178179

179180
final List<Integer> parameters = new ArrayList<>();
180181
final Map<String, Integer> positions = new HashMap<>();
@@ -277,12 +278,12 @@ TOKEN_MGR_DECLS: {
277278

278279
if (handler != null) {
279280
s = handler.handleStatement(
280-
sqlStmt, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups);
281+
sqlStmt, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups, funcUsed);
281282
}
282283

283284
if (s == null) {
284285
s = new ClickHouseSqlStatement(
285-
sqlStmt, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups);
286+
sqlStmt, stmtType, cluster, database, table, input, compressAlgorithm, compressLevel, format, file, parameters, positions, settings, tempTables, valueGroups, funcUsed);
286287
}
287288

288289
// reset variables
@@ -811,7 +812,7 @@ void columnExpr(): { Token t; } {
811812
| LOOKAHEAD(3) literal() <REGEXP> literal()
812813
| (LOOKAHEAD(2) macro())+
813814
| LOOKAHEAD(2, { !(tokenIn(1, INF, NAN, NULL) && tokenIn(2, DOT)) }) literal()
814-
| LOOKAHEAD(2, { getToken(2).kind == LPAREN }) functionExpr()
815+
| LOOKAHEAD(2, { getToken(2).kind == LPAREN }) functionExpr() { token_source.funcUsed = true; }
815816
| anyIdentifier() (LOOKAHEAD(2) <DOT> anyIdentifier())*
816817
}
817818

0 commit comments

Comments
 (0)