Skip to content

Commit 5bebe93

Browse files
committed
[fix][headless] Solve the problem of SQL execution error when alias is Chinese
1 parent eef7b3c commit 5bebe93

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.tencent.supersonic.common.jsqlparser;
2+
3+
import net.sf.jsqlparser.expression.Alias;
4+
import net.sf.jsqlparser.statement.select.SelectItem;
5+
import net.sf.jsqlparser.statement.select.SelectItemVisitorAdapter;
6+
import org.apache.commons.lang3.StringUtils;
7+
8+
public class FieldAliasReplaceWithBackticksVisitor extends SelectItemVisitorAdapter {
9+
10+
@Override
11+
public void visit(SelectItem selectExpressionItem) {
12+
Alias alias = selectExpressionItem.getAlias();
13+
if (alias == null) {
14+
return;
15+
}
16+
String aliasName = alias.getName();
17+
String replaceValue = loadRefName(aliasName);
18+
if (StringUtils.isBlank(replaceValue)) {
19+
return;
20+
}
21+
alias.setName(replaceValue);
22+
}
23+
24+
private String loadRefName(String aliasName) {
25+
if (StringUtils.isBlank(aliasName)) {
26+
return "";
27+
}
28+
if (aliasName.startsWith("`") && aliasName.endsWith("`")) {
29+
return "";
30+
}
31+
return "`" + aliasName + "`";
32+
}
33+
}

common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,19 @@ public static String replaceAliasFieldName(String sql, Map<String, String> field
486486
return selectStatement.toString();
487487
}
488488

489+
public static String replaceAliasWithBackticks(String sql) {
490+
Select selectStatement = SqlSelectHelper.getSelect(sql);
491+
if (!(selectStatement instanceof PlainSelect)) {
492+
return sql;
493+
}
494+
PlainSelect plainSelect = (PlainSelect) selectStatement;
495+
FieldAliasReplaceWithBackticksVisitor visitor = new FieldAliasReplaceWithBackticksVisitor();
496+
for (SelectItem selectItem : plainSelect.getSelectItems()) {
497+
selectItem.accept(visitor);
498+
}
499+
return selectStatement.toString();
500+
}
501+
489502
public static String replaceAlias(String sql) {
490503
Select selectStatement = SqlSelectHelper.getSelect(sql);
491504
if (!(selectStatement instanceof PlainSelect)) {

common/src/test/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelperTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,26 @@ void testReplaceAlias() {
302302
replaceSql);
303303
}
304304

305+
@Test
306+
void testReplaceAliasWithBackticks() {
307+
String sql = "SELECT 部门, SUM(访问次数) AS 总访问次数 FROM 超音数 WHERE "
308+
+ "datediff('day', 数据日期, '2023-09-05') <= 3 GROUP BY 部门 ORDER BY 总访问次数 DESC LIMIT 10";
309+
String replaceSql = SqlReplaceHelper.replaceAliasWithBackticks(sql);
310+
System.out.println(replaceSql);
311+
Assert.assertEquals("SELECT 部门, SUM(访问次数) AS `总访问次数` FROM 超音数 WHERE "
312+
+ "datediff('day', 数据日期, '2023-09-05') <= 3 GROUP BY 部门 ORDER BY 总访问次数 DESC LIMIT 10",
313+
replaceSql);
314+
315+
sql = "select 部门, sum(访问次数) as 访问次数 from 超音数 where "
316+
+ "(datediff('day', 数据日期, '2023-09-05') <= 3) and 数据日期 = '2023-10-10' "
317+
+ "group by 部门 order by 访问次数 desc limit 10";
318+
replaceSql = SqlReplaceHelper.replaceAliasWithBackticks(sql);
319+
System.out.println(replaceSql);
320+
Assert.assertEquals("SELECT 部门, sum(访问次数) AS `访问次数` FROM 超音数 WHERE (datediff('day', 数据日期, "
321+
+ "'2023-09-05') <= 3) AND 数据日期 = '2023-10-10' GROUP BY 部门 ORDER BY 访问次数 DESC LIMIT 10",
322+
replaceSql);
323+
}
324+
305325
@Test
306326
void testReplaceAliasFieldName() {
307327
Map<String, String> map = new HashMap<>();

headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public void parse(QueryStatement queryStatement) throws Exception {
6868
ontologyQuery.setAggOption(sqlQueryAggOption);
6969

7070
convertNameToBizName(queryStatement);
71+
// Solve the problem of SQL execution error when alias is Chinese
72+
aliasesWithBackticks(queryStatement);
7173
rewriteOrderBy(queryStatement);
7274

7375
// fill sqlQuery
@@ -88,6 +90,12 @@ public void parse(QueryStatement queryStatement) throws Exception {
8890
log.info("parse sqlQuery [{}] ", sqlQuery);
8991
}
9092

93+
private void aliasesWithBackticks(QueryStatement queryStatement) {
94+
String sql = queryStatement.getSqlQuery().getSql();
95+
sql = SqlReplaceHelper.replaceAliasWithBackticks(sql);
96+
queryStatement.getSqlQuery().setSql(sql);
97+
}
98+
9199
private AggOption getAggOption(String sql, Set<MetricSchemaResp> metricSchemas) {
92100
if (SqlSelectFunctionHelper.hasAggregateFunction(sql)) {
93101
return AggOption.AGGREGATION;

0 commit comments

Comments
 (0)