From a69b47d1f51fcbd324254c706ec4a5e30ff30d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Thu, 17 Sep 2020 20:42:42 +0800 Subject: [PATCH] fix for pull request #3561 --- .../druid/sql/parser/SQLExprParser.java | 33 ++++++++++++++----- .../createTable/MySqlCreateTableTest135.java | 19 ++++++----- 2 files changed, 34 insertions(+), 18 deletions(-) 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 f4820eb5e1..1b79382867 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -2716,18 +2716,33 @@ public class SQLExprParser extends SQLParser { } } - if (typeNameHashCode == FnvHash.Constants.NATIONAL) { - if (lexer.token == Token.IDENTIFIER) { - String nationalName = lexer.stringVal(); - if ("varchar".equalsIgnoreCase(nationalName) || "char" - .equalsIgnoreCase(nationalName)) { - typeName = (" n" + lexer.stringVal().toLowerCase()); - lexer.nextToken(); - } + if (isCharType(typeName)) { + SQLCharacterDataType charType = new SQLCharacterDataType(typeName); + + if (lexer.token == Token.LPAREN) { + lexer.nextToken(); + SQLExpr arg = this.expr(); + arg.setParent(charType); + charType.addArgument(arg); + accept(Token.RPAREN); } + + charType = (SQLCharacterDataType) parseCharTypeRest(charType); + + if (lexer.token == Token.HINT) { + List hints = this.parseHints(); + charType.setHints(hints); + } + + return charType; } - if (isCharType(typeName)) { + if ("national".equalsIgnoreCase(typeName) && + (lexer.identifierEquals(FnvHash.Constants.CHAR) + || lexer.identifierEquals(FnvHash.Constants.VARCHAR))) { + typeName += ' ' + lexer.stringVal(); + lexer.nextToken(); + SQLCharacterDataType charType = new SQLCharacterDataType(typeName); if (lexer.token == Token.LPAREN) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest135.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest135.java index 25a7df037e..194d15e69c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest135.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest135.java @@ -26,16 +26,17 @@ public class MySqlCreateTableTest135 extends MysqlTest { assertEquals(1, statementList.size()); - assertEquals("CREATE TABLE MQ_TOPIC_RECORD (\n" - + "\tTOPIC_ID bigint(11) NOT NULL,\n" - + "\tBROKENNAME nvarchar(50),\n" - + "\tBROKENNAME2 nchar(50)\n" - + ");", stmt.toString()); + assertEquals("CREATE TABLE MQ_TOPIC_RECORD (\n" + + "\tTOPIC_ID bigint(11) NOT NULL,\n" + + "\tBROKENNAME national VARCHAR(50),\n" + + "\tBROKENNAME2 national CHAR(50)\n" + + ");", stmt.toString()); - assertEquals("create table MQ_TOPIC_RECORD (\n" - + "\tTOPIC_ID bigint(11) not null,\n" - + "\tBROKENNAME nvarchar(50),\n" - + "\tBROKENNAME2 nchar(50)\n" + ");", stmt.toLowerCaseString()); + assertEquals("create table MQ_TOPIC_RECORD (\n" + + "\tTOPIC_ID bigint(11) not null,\n" + + "\tBROKENNAME national VARCHAR(50),\n" + + "\tBROKENNAME2 national CHAR(50)\n" + + ");", stmt.toLowerCaseString()); } }