Skip to content

Commit d061495

Browse files
authored
Merge pull request #776 from tianlu-root/master
fix: sql parse fallback bug fix
2 parents 9860d57 + a529f84 commit d061495

File tree

3 files changed

+40
-15
lines changed

3 files changed

+40
-15
lines changed

data-providers/src/main/java/datart/data/provider/jdbc/RegexVariableResolver.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,41 +43,57 @@ public static List<VariablePlaceholder> resolve(SqlDialect sqlDialect, String sr
4343
return Collections.emptyList();
4444
}
4545

46-
List<VariablePlaceholder> placeholders = new LinkedList<>();
4746
Matcher matcher = Const.VARIABLE_PATTERN.matcher(srcSql);
47+
Map<String, ScriptVariable> variablePlaceholderMap = new HashMap<>();
4848
while (matcher.find()) {
4949
String group = matcher.group();
5050
ScriptVariable scriptVariable = variableMap.get(group);
51-
placeholders.add(createPlaceholder(sqlDialect, srcSql, group, scriptVariable));
51+
variablePlaceholderMap.put(group, scriptVariable);
52+
}
53+
if (variablePlaceholderMap.isEmpty()) {
54+
return Collections.emptyList();
55+
}
56+
57+
58+
List<VariablePlaceholder> placeholders = new LinkedList<>();
59+
for (Map.Entry<String, ScriptVariable> entry : variablePlaceholderMap.entrySet()) {
60+
placeholders.addAll(createPlaceholder(sqlDialect, srcSql, entry.getKey(), entry.getValue()));
5261
}
5362
return placeholders;
5463

5564
}
5665

57-
private static VariablePlaceholder createPlaceholder(SqlDialect sqlDialect, String sql, String variableFragment, ScriptVariable variable) {
66+
private static List<VariablePlaceholder> createPlaceholder(SqlDialect sqlDialect, String sql, String variableFragment, ScriptVariable variable) {
5867

59-
String variableExpression = tryMatchVariableExpression(sql, variableFragment);
68+
List<VariablePlaceholder> placeholders = new LinkedList<>();
6069

61-
SqlCall sqlCall = parseAsSqlCall(variableExpression, variableFragment);
70+
List<String> variableExpressions = tryMatchVariableExpression(sql, variableFragment);
6271

63-
if (sqlCall == null) {
64-
return new SimpleVariablePlaceholder(variable, sqlDialect, variableFragment);
65-
} else {
66-
return new VariablePlaceholder(Collections.singletonList(variable), sqlDialect, sqlCall, variableExpression);
72+
if (!CollectionUtils.isEmpty(variableExpressions)) {
73+
for (String expression : variableExpressions) {
74+
SqlCall sqlCall = parseAsSqlCall(expression, variableFragment);
75+
if (sqlCall != null) {
76+
placeholders.add(new VariablePlaceholder(Collections.singletonList(variable), sqlDialect, sqlCall, expression));
77+
} else {
78+
placeholders.add(new SimpleVariablePlaceholder(variable, sqlDialect, variableFragment));
79+
}
80+
}
6781
}
68-
82+
return placeholders;
6983
}
7084

7185

72-
private static String tryMatchVariableExpression(String sql, String variableFragment) {
86+
private static List<String> tryMatchVariableExpression(String sql, String variableFragment) {
7387
String reg = String.format(REG_VARIABLE_EXPRESSION_TEMPLATE, variableFragment.replace("$", "\\$"));
7488
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
7589
Matcher matcher = pattern.matcher(sql);
76-
if (matcher.find()) {
77-
return matcher.group();
78-
} else {
79-
return null;
90+
91+
List<String> expressions = new LinkedList<>();
92+
93+
while (matcher.find()) {
94+
expressions.add(matcher.group());
8095
}
96+
return expressions;
8197
}
8298

8399
public static SqlCall parseAsSqlCall(String variableExpression, String variableFragment) {

data-providers/src/main/java/datart/data/provider/jdbc/SqlScriptRender.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.apache.commons.lang3.CharUtils;
4747
import org.apache.commons.lang3.StringUtils;
4848

49+
import java.util.Comparator;
4950
import java.util.List;
5051
import java.util.Map;
5152
import java.util.stream.Collectors;
@@ -160,6 +161,11 @@ public String replaceVariables(String selectSql) throws SqlParseException {
160161
RequestContext.putWarning(MessageResolver.getMessage("message.provider.sql.parse.failed"), sqlParseError);
161162
placeholders = RegexVariableResolver.resolve(sqlDialect, selectSql, variableMap);
162163
}
164+
165+
placeholders = placeholders.stream()
166+
.sorted(Comparator.comparingDouble(holder -> (holder instanceof SimpleVariablePlaceholder) ? 1000 + holder.getOriginalSqlFragment().length() : -holder.getOriginalSqlFragment().length()))
167+
.collect(Collectors.toList());
168+
163169
if (CollectionUtils.isNotEmpty(placeholders)) {
164170
for (VariablePlaceholder placeholder : placeholders) {
165171
ReplacementPair replacementPair = placeholder.replacementPair();
@@ -234,4 +240,5 @@ private String cleanupSql(String sql) {
234240
return sql.trim();
235241
}
236242

243+
237244
}

data-providers/src/main/java/datart/data/provider/script/VariablePlaceholder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import datart.data.provider.calcite.SqlValidateUtils;
1010
import datart.data.provider.calcite.custom.SqlSimpleStringLiteral;
1111
import datart.data.provider.jdbc.SqlScriptRender;
12+
import lombok.Getter;
1213
import lombok.extern.slf4j.Slf4j;
1314
import org.apache.calcite.sql.*;
1415
import org.apache.calcite.sql.fun.SqlLikeOperator;
@@ -29,6 +30,7 @@ public class VariablePlaceholder {
2930

3031
protected final SqlCall sqlCall;
3132

33+
@Getter
3234
protected final String originalSqlFragment;
3335

3436
public ReplacementPair replacementPair() {

0 commit comments

Comments
 (0)