From 849e8bd56c818cbac59209e4b6f3f76feec5fb5b Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 12 Jun 2025 16:20:33 +0800 Subject: [PATCH] (fix)(common) Fix Parse error caused by full-width characters. --- .../common/jsqlparser/SqlSelectHelper.java | 92 +++++++++++-------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlSelectHelper.java index fc4281a6e..7732791d3 100644 --- a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlSelectHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlSelectHelper.java @@ -5,52 +5,20 @@ import com.google.common.collect.Sets; import com.tencent.supersonic.common.util.StringUtil; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.Alias; -import net.sf.jsqlparser.expression.BinaryExpression; -import net.sf.jsqlparser.expression.CaseExpression; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; -import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.WhenClause; +import net.sf.jsqlparser.expression.*; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.conditional.XorExpression; -import net.sf.jsqlparser.expression.operators.relational.Between; -import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.expression.operators.relational.InExpression; -import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression; -import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; +import net.sf.jsqlparser.expression.operators.relational.*; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.select.FromItem; -import net.sf.jsqlparser.statement.select.GroupByElement; -import net.sf.jsqlparser.statement.select.Join; -import net.sf.jsqlparser.statement.select.LateralView; -import net.sf.jsqlparser.statement.select.Limit; -import net.sf.jsqlparser.statement.select.OrderByElement; -import net.sf.jsqlparser.statement.select.ParenthesedSelect; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SelectItem; -import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; -import net.sf.jsqlparser.statement.select.SetOperationList; -import net.sf.jsqlparser.statement.select.WithItem; +import net.sf.jsqlparser.statement.select.*; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -59,6 +27,27 @@ import java.util.stream.Collectors; @Slf4j public class SqlSelectHelper { + /*** + * @Author: luxf yclxf@yeah.net + * @Description: + * @Date: 12/06/2025 + * 全角转半角字符映射 + **/ + private static final Map fullWidthToHalfWidthMap = new HashMap() {{ + put('(', '('); + put(')', ')'); + put(',', ','); + put(';', ';'); + put(':', ':'); + put('!', '!'); + put('?', '?'); + put('{', '{'); + put('}', '}'); + put('[', '['); + put(']', ']'); + put('=', '='); + }}; + public static List getFilterExpression(String sql) { List plainSelectList = getPlainSelect(sql); Set result = new HashSet<>(); @@ -222,10 +211,35 @@ public class SqlSelectHelper { } } + /*** + * @Author: luxf yclxf@yeah.net + * @Description: + * @Date: 12/06/2025 + * @param: sql + * @return: java.lang.String + * 全角转半角字符方法 + **/ + private static String convertFullWidthToHalfWidth(String sql) { + if (StringUtils.isEmpty(sql)) { + return sql; + } + StringBuilder sb = new StringBuilder(); + for (char c : sql.toCharArray()) { + if (fullWidthToHalfWidthMap.containsKey(c)) { + sb.append(fullWidthToHalfWidthMap.get(c)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + public static Select getSelect(String sql) { Statement statement = null; try { - statement = CCJSqlParserUtil.parse(sql); + // 预处理SQL,转换全角字符为半角 + String sql_handled = convertFullWidthToHalfWidth(sql); + statement = CCJSqlParserUtil.parse(sql_handled); } catch (JSQLParserException e) { log.error("parse error, sql:{}", sql, e); throw new RuntimeException(e); @@ -820,7 +834,7 @@ public class SqlSelectHelper { } private static void getFieldsWithSubQuery(PlainSelect plainSelect, - Map> fields) { + Map> fields) { if (plainSelect.getFromItem() instanceof Table) { List withAlias = new ArrayList<>(); if (!CollectionUtils.isEmpty(plainSelect.getWithItemsList())) { @@ -923,7 +937,7 @@ public class SqlSelectHelper { } public static void collectWithItemPlainSelects(List withItemList, - Set selects) { if (CollectionUtils.isEmpty(withItemList)) { return; }