From 165eefe9a9528b5e8b9919298963687dc8ec1be8 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 5 Aug 2016 16:22:58 +0800 Subject: [PATCH] bug fixed for sql parser. issue #1356 --- .../druid/sql/parser/SQLExprParser.java | 2 +- .../bvt/sql/mysql/MySqlCeateTableTest34.java | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCeateTableTest34.java 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 d912f29797..c52bc7bf9a 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -785,7 +785,7 @@ public class SQLExprParser extends SQLParser { accept(Token.LPAREN); } - if (expr instanceof SQLName || expr instanceof SQLDefaultExpr) { + if (expr instanceof SQLName || expr instanceof SQLDefaultExpr || expr instanceof SQLCharExpr) { String methodName; SQLMethodInvokeExpr methodInvokeExpr; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCeateTableTest34.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCeateTableTest34.java new file mode 100644 index 0000000000..2a61f9d6f0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCeateTableTest34.java @@ -0,0 +1,60 @@ +package com.alibaba.druid.bvt.sql.mysql; + +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; +import com.alibaba.druid.stat.TableStat; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.List; + +/** + * Created by wenshao on 16/8/5. + */ +public class MySqlCeateTableTest34 extends TestCase { + public void test_for_parse() throws Exception { + String sql = "CREATE TABLE \"item_extra\" (\n" + + " \"id\" int(10) unsigned NOT NULL AUTO_INCREMENT,\n" + + " \"item_id\" int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',\n" + + " \"type\" tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '扩展属性类型,0:虚拟商品',\n" + + " \"attr_key\" varchar(50) NOT NULL COMMENT '扩展属性key',\n" + + " \"attr_value\" varchar(500) NOT NULL COMMENT '扩展属性value',\n" + + " PRIMARY KEY (\"id\"),\n" + + " KEY \"idx_item_type_kv\" (\"item_id\",\"type\",\"attr_key\",\"attr_value\"(191))\n" + + ")"; // + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); +// print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("item_extra"))); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("CREATE TABLE \"item_extra\" (\n" + + "\t\"id\" int(10) UNSIGNED NOT NULL AUTO_INCREMENT, \n" + + "\t\"item_id\" int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品id', \n" + + "\t\"type\" tinyint(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '扩展属性类型,0:虚拟商品', \n" + + "\t\"attr_key\" varchar(50) NOT NULL COMMENT '扩展属性key', \n" + + "\t\"attr_value\" varchar(500) NOT NULL COMMENT '扩展属性value', \n" + + "\tPRIMARY KEY ('id'), \n" + + "\tKEY \"idx_item_type_kv\" ('item_id', 'type', 'attr_key', 'attr_value'(191))\n" + + ")", output); + } +}