[fix][headless] Solve the problem of SQL execution error when alias is Chinese (#2039)
Some checks are pending
supersonic CentOS CI / build (21) (push) Waiting to run
supersonic mac CI / build (21) (push) Waiting to run
supersonic ubuntu CI / build (21) (push) Waiting to run
supersonic windows CI / build (21) (push) Waiting to run

This commit is contained in:
Hwwwww
2025-02-09 22:59:35 +08:00
committed by GitHub
parent eef7b3c443
commit a8157ee769
4 changed files with 74 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package com.tencent.supersonic.common.jsqlparser;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SelectItemVisitorAdapter;
import org.apache.commons.lang3.StringUtils;
public class FieldAliasReplaceWithBackticksVisitor extends SelectItemVisitorAdapter {
@Override
public void visit(SelectItem selectExpressionItem) {
Alias alias = selectExpressionItem.getAlias();
if (alias == null) {
return;
}
String aliasName = alias.getName();
String replaceValue = addBackticks(aliasName);
if (StringUtils.isBlank(replaceValue)) {
return;
}
alias.setName(replaceValue);
}
private String addBackticks(String aliasName) {
if (StringUtils.isBlank(aliasName)) {
return "";
}
if (aliasName.startsWith("`") && aliasName.endsWith("`")) {
return "";
}
return "`" + aliasName + "`";
}
}

View File

@@ -486,6 +486,19 @@ public class SqlReplaceHelper {
return selectStatement.toString();
}
public static String replaceAliasWithBackticks(String sql) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (!(selectStatement instanceof PlainSelect)) {
return sql;
}
PlainSelect plainSelect = (PlainSelect) selectStatement;
FieldAliasReplaceWithBackticksVisitor visitor = new FieldAliasReplaceWithBackticksVisitor();
for (SelectItem selectItem : plainSelect.getSelectItems()) {
selectItem.accept(visitor);
}
return selectStatement.toString();
}
public static String replaceAlias(String sql) {
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (!(selectStatement instanceof PlainSelect)) {