diff --git a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java index 0c8aeb4e11..bf66b7daea 100644 --- a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java +++ b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java @@ -2,6 +2,8 @@ package io.dataease.commons.utils; import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.dataset.dto.SqlVariableDetails; +import io.dataease.api.ds.vo.DatasourceConfiguration; +import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.exception.DEException; import io.dataease.i18n.Translator; import io.dataease.utils.JsonUtil; @@ -17,6 +19,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -117,7 +120,7 @@ public class SqlparserUtils { }; } - public static String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List parameters) { + public static String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List parameters, boolean isCross, Map dsMap) { if (StringUtils.isEmpty(sql)) { DEException.throwException(Translator.get("i18n_sql_not_empty")); } @@ -165,6 +168,23 @@ public class SqlparserUtils { try { sql = removeVariables(sql); + + // replace keyword '`' + if (!isCross) { + Map.Entry next = dsMap.entrySet().iterator().next(); + DatasourceSchemaDTO value = next.getValue(); + DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(value.getType()); + String prefix = datasourceType.getPrefix(); + String suffix = datasourceType.getSuffix(); + + Pattern pattern = Pattern.compile("(`.*?`)"); + Matcher matcher = pattern.matcher(sql); + while (matcher.find()) { + String group = matcher.group(); + String info = group.substring(1, group.length() - 1); + sql = sql.replaceAll(group, prefix + info + suffix); + } + } } catch (Exception e) { e.printStackTrace(); } diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index 26cd66e903..0dcead2fa9 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -104,7 +104,7 @@ public class DatasetDataManage { sql = SqlUtils.transSqlDialect(sql, datasourceRequest.getDsList()); } else { // parser sql params and replace default value - String originSql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(tableInfoDTO.getSql())), datasetTableDTO.getSqlVariableDetails(), false, false, null); + String originSql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(tableInfoDTO.getSql())), datasetTableDTO.getSqlVariableDetails(), false, false, null, false, datasourceRequest.getDsList()); // add sql table schema sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0); @@ -302,13 +302,15 @@ public class DatasetDataManage { } String alias = String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId()); datasourceSchemaDTO.setSchemaAlias(alias); - // parser sql params and replace default value - String originSql = SqlparserUtils.handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(new String(Base64.getDecoder().decode(dto.getSql()))), dto.getSqlVariableDetails(), true, true, null); Map dsMap = new LinkedHashMap<>(); dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDsList(dsMap); + + // parser sql params and replace default value + String originSql = SqlparserUtils.handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(new String(Base64.getDecoder().decode(dto.getSql()))), dto.getSqlVariableDetails(), true, true, null, false, dsMap); + // sql 作为临时表,外层加上limit String sql; if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) { diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java index b5604c1621..a2d24d7346 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java @@ -36,6 +36,8 @@ import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -97,7 +99,7 @@ public class DatasetSQLManage { Set allDs = getAllDs(union); boolean isCross = allDs.size() > 1; - SQLObj tableName = getUnionTable(currentDs, infoDTO, tableSchema, 0, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross); + SQLObj tableName = getUnionTable(currentDs, infoDTO, tableSchema, 0, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap); for (int i = 0; i < union.size(); i++) { UnionDTO unionDTO = union.get(i); @@ -110,7 +112,7 @@ public class DatasetSQLManage { } else { schema = putObj2Map(dsMap, datasetTable); } - SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross); + SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap); // 获取前端传过来选中的字段 List fields = unionDTO.getCurrentDsFields(); @@ -273,7 +275,7 @@ public class DatasetSQLManage { } else { schema = putObj2Map(dsMap, datasetTable); } - SQLObj table = getUnionTable(datasetTable, tableInfo, schema, index, filterParameters(chartExtRequest, datasetTable.getId()), chartExtRequest == null, isCross); + SQLObj table = getUnionTable(datasetTable, tableInfo, schema, index, filterParameters(chartExtRequest, datasetTable.getId()), chartExtRequest == null, isCross, dsMap); List fields = unionDTO.getCurrentDsFields(); fields = fields.stream().filter(DatasetTableFieldDTO::getChecked).collect(Collectors.toList()); @@ -384,14 +386,14 @@ public class DatasetSQLManage { } } - private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List parameters, boolean isFromDataSet, boolean isCross) { + private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List parameters, boolean isFromDataSet, boolean isCross, Map dsMap) { SQLObj tableObj; String tableAlias = String.format(SQLConstants.TABLE_ALIAS_PREFIX, index); if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_DB)) { tableObj = SQLObj.builder().tableSchema(tableSchema).tableName(infoDTO.getTable()).tableAlias(tableAlias).build(); } else if (StringUtils.equalsIgnoreCase(currentDs.getType(), DatasetTableTypeConstants.DATASET_TABLE_SQL)) { // parser sql params and replace default value - String sql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(infoDTO.getSql())), currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters); + String sql = SqlparserUtils.handleVariableDefaultValue(new String(Base64.getDecoder().decode(infoDTO.getSql())), currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters, isCross, dsMap); // add table schema if (isCross) { sql = SqlUtils.addSchema(sql, tableSchema);