From 4587054bffd4094cf91a6b668dc744be211c0aef Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 7 Oct 2017 17:03:00 +0800 Subject: [PATCH] improved mysql parser. for issue #2028 --- .../mysql/parser/MySqlCreateTableParser.java | 5 +- .../dialect/mysql/parser/MySqlExprParser.java | 6 ++ .../createTable/MySqlCreateTableTest81.java | 67 +++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 390b92567d..1203aab0cc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -52,6 +52,7 @@ import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLCreateTableParser; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.util.FnvHash; public class MySqlCreateTableParser extends SQLCreateTableParser { @@ -795,7 +796,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } // 5.5语法 USING BTREE 放在index 名字后 - if (lexer.identifierEquals("USING")) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); key.setIndexType(lexer.stringVal()); lexer.nextToken(); @@ -825,7 +826,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { key.setName(name); } - if (lexer.identifierEquals("USING")) { + if (lexer.identifierEquals(FnvHash.Constants.USING)) { lexer.nextToken(); key.setIndexType(lexer.stringVal()); lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index d796b7d6ea..0dd4fe092d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -692,6 +692,12 @@ public class MySqlExprParser extends SQLExprParser { } accept(Token.RPAREN); + if (lexer.identifierEquals(FnvHash.Constants.USING)) { + lexer.nextToken(); + primaryKey.setIndexType(lexer.stringVal()); + lexer.nextToken(); + } + return primaryKey; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java new file mode 100644 index 0000000000..81e42f30bd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java @@ -0,0 +1,67 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.createTable; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +public class MySqlCreateTableTest81 extends MysqlTest { + + public void test_one() throws Exception { + String sql = "CREATE TABLE `admin` (\n" + + " `id` char(20) NOT NULL,\n" + + " `username` varchar(16) NOT NULL COMMENT '用户名',\n" + + " `password` varchar(32) NOT NULL COMMENT '密码',\n" + + " `permission` varchar(255) NOT NULL DEFAULT '' COMMENT '权限',\n" + + " PRIMARY KEY (`id`) USING BTREE\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseCreateTable(); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); +// +// Column column = visitor.getColumn("tb_custom_vip_show_message", "custom_vip_show_message_seq"); +// assertNotNull(column); +// assertEquals("INT", column.getDataType()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("CREATE TABLE `admin` (\n" + + "\t`id` char(20) NOT NULL,\n" + + "\t`username` varchar(16) NOT NULL COMMENT '用户名',\n" + + "\t`password` varchar(32) NOT NULL COMMENT '密码',\n" + + "\t`permission` varchar(255) NOT NULL DEFAULT '' COMMENT '权限',\n" + + "\tPRIMARY KEY USING BTREE (`id`)\n" + + ") ENGINE = InnoDB CHARSET = utf8 COMMENT '管理员'", output); + } + + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("create table `admin` (\n" + + "\t`id` char(20) not null,\n" + + "\t`username` varchar(16) not null comment '用户名',\n" + + "\t`password` varchar(32) not null comment '密码',\n" + + "\t`permission` varchar(255) not null default '' comment '权限',\n" + + "\tprimary key using BTREE (`id`)\n" + + ") engine = InnoDB charset = utf8 comment '管理员'", output); + } + } +}