From 3b9a294f8df994902322d09597a9d58da1f5e03d Mon Sep 17 00:00:00 2001 From: baofengqi Date: Fri, 28 Feb 2025 16:21:30 +0800 Subject: [PATCH] =?UTF-8?q?dble=20reports=20syntax=20error=20when=20sql=20?= =?UTF-8?q?contains=20chinese=20symbol=20=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dble/route/impl/DefaultRouteStrategy.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/actiontech/dble/route/impl/DefaultRouteStrategy.java b/src/main/java/com/actiontech/dble/route/impl/DefaultRouteStrategy.java index 6ab94c75f..efb4984c9 100644 --- a/src/main/java/com/actiontech/dble/route/impl/DefaultRouteStrategy.java +++ b/src/main/java/com/actiontech/dble/route/impl/DefaultRouteStrategy.java @@ -21,6 +21,8 @@ import java.sql.SQLException; import java.sql.SQLSyntaxErrorException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class DefaultRouteStrategy extends AbstractRouteStrategy { @@ -41,6 +43,18 @@ protected RouteResultset routeNormalSqlWithAST(SchemaConfig schema, } private SQLStatement parserSQL(String originSql, ServerConnection c) throws SQLSyntaxErrorException { + + // 提取 SELECT 和 FROM 之间的字段部分(忽略大小写) + Pattern pattern = Pattern.compile("(?i)SELECT\\s+(.*?)\\s+FROM", Pattern.DOTALL); + Matcher matcher = pattern.matcher(originSql); + if (matcher.find()) { + String selectList = matcher.group(1); + // 仅检查字段列表中的逗号 + if (Pattern.compile("[,\\uFF0C]").matcher(selectList).find()) { + throw new SQLSyntaxErrorException("invalid chinese symbol ,"); + } + } + SQLStatementParser parser = new MySqlStatementParser(originSql); try { return parser.parseStatement(true);