From b6a0fb52f345efdcbd33e189982c79b788dd787d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 7 Oct 2020 00:53:07 +0800 Subject: [PATCH] improved sql parser support, fix #3947 --- src/main/java/com/alibaba/druid/sql/SQLUtils.java | 3 +++ .../java/com/alibaba/druid/sql/parser/SQLExprParser.java | 4 +++- .../com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_3.java | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 76e7846649..116067802a 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -585,6 +585,9 @@ public class SQLUtils { return stmtList.get(0); } + public static SQLStatement parseSingleStatement(String sql, String dbType, SQLParserFeature... features) { + return parseSingleStatement(sql, DbType.of(dbType), features); + } public static SQLStatement parseSingleStatement(String sql, DbType dbType, SQLParserFeature... features) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, features); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 2cefea8407..6fdc1cd006 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -4442,7 +4442,9 @@ public class SQLExprParser extends SQLParser { } else if (dbType == DbType.db2) { } else if (lexer.token == Token.QUES || lexer.token == Token.LITERAL_CHARS - || lexer.token == Token.LITERAL_ALIAS) { + || lexer.token == Token.LITERAL_ALIAS + || lexer.identifierEquals("utf8mb4") + ) { // skip } else { accept(Token.EQ); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_3.java index f3ad4d06c7..92e9c81fb3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_3.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.bvt.sql.mysql; +import com.alibaba.druid.DbType; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; @@ -52,4 +53,9 @@ public class MySqlSetTest_3 extends TestCase { Assert.assertEquals("SET sql_mode = ?, NAMES ?, CHARACTER SET utf8, CHARACTER_SET_RESULTS = utf8, COLLATION_CONNECTION = ?", text); } + + public void test_1() throws Exception { + SQLUtils.parseSingleStatement("set names utf8mb4", "mysql"); + SQLUtils.parseSingleStatement("set names utf8mb4", (DbType) null); + } }