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 dc95228273..41d0102f7d 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 @@ -172,7 +172,21 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { stmt.getTableElementList().add(idx); } else if (lexer.token() == (Token.KEY)) { - stmt.getTableElementList().add(parseConstraint()); + Lexer.SavePoint savePoint = lexer.mark(); + lexer.nextToken(); + + boolean isColumn = false; + if (lexer.identifierEquals(FnvHash.Constants.VARCHAR)) { + isColumn = true; + } + lexer.reset(savePoint); + + if (isColumn) { + column = this.exprParser.parseColumn(); + stmt.getTableElementList().add(column); + } else { + stmt.getTableElementList().add(parseConstraint()); + } } else if (lexer.token() == (Token.PRIMARY)) { SQLTableConstraint pk = parseConstraint(); pk.setParent(stmt); 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 7270610c78..c644844c6b 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1333,6 +1333,7 @@ public class SQLExprParser extends SQLParser { case SCHEMA: case INTERVAL: case EXPLAIN: + case PARTITION: case SET: identName = lexer.stringVal(); lexer.nextToken(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest98_keyword.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest98_keyword.java new file mode 100644 index 0000000000..f418a3dede --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest98_keyword.java @@ -0,0 +1,122 @@ +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.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlCreateTableTest98_keyword extends MysqlTest { + + public void test_0() throws Exception { + String sql = " CREATE TABLE IF NOT EXISTS meta.view (\n" + + " cluster_name varchar(16) ,\n" + + " table_schema varchar(128), \n" + + " view_name varchar(128), \n" + + " column_list text, \n" + + " sql text\n" + + " )"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement)statementList.get(0); + + assertEquals(1, statementList.size()); + assertEquals(5, stmt.getTableElementList().size()); + + assertEquals("CREATE TABLE IF NOT EXISTS meta.view (\n" + + "\tcluster_name varchar(16),\n" + + "\ttable_schema varchar(128),\n" + + "\tview_name varchar(128),\n" + + "\tcolumn_list text,\n" + + "\tsql text\n" + + ")", stmt.toString()); + + } + + public void test_1() throws Exception { + String sql = " CREATE TABLE IF NOT EXISTS meta.partitions (\n" + + " cluster_name varchar(16) ,\n" + + " table_schema varchar(128), \n" + + " view_name varchar(128), \n" + + " column_list text, \n" + + " sql text\n" + + " )"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement)statementList.get(0); + + assertEquals(1, statementList.size()); + assertEquals(5, stmt.getTableElementList().size()); + + assertEquals("CREATE TABLE IF NOT EXISTS meta.partitions (\n" + + "\tcluster_name varchar(16),\n" + + "\ttable_schema varchar(128),\n" + + "\tview_name varchar(128),\n" + + "\tcolumn_list text,\n" + + "\tsql text\n" + + ")", stmt.toString()); + + } + + public void test_2() throws Exception { + String sql = " CREATE TABLE IF NOT EXISTS meta.partitions (\n" + + " cluster_name varchar(16) ,\n" + + " table_schema varchar(128), \n" + + " partition varchar(128), \n" + + " column_list text, \n" + + " sql text\n" + + " )"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement)statementList.get(0); + + assertEquals(1, statementList.size()); + assertEquals(5, stmt.getTableElementList().size()); + + assertEquals("CREATE TABLE IF NOT EXISTS meta.partitions (\n" + + "\tcluster_name varchar(16),\n" + + "\ttable_schema varchar(128),\n" + + "\tpartition varchar(128),\n" + + "\tcolumn_list text,\n" + + "\tsql text\n" + + ")", stmt.toString()); + + } + + public void test_3() throws Exception { + String sql = "create table IF NOT EXISTS meta.build_table_statistic_info(" + + " cluster_name varchar(16), " + + " table_schema varchar(128), " + + " table_name varchar(128), " + + " key varchar(128), " + + " value varchar(128), " + + " table_schema_id varchar(128), " + + " table_id varchar(128), " + + " data_version bigint, " + + " create_time timestamp, " + + " update_time timestamp" + + ")"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement)statementList.get(0); + + assertEquals(1, statementList.size()); + assertEquals(10, stmt.getTableElementList().size()); + + assertEquals("CREATE TABLE IF NOT EXISTS meta.build_table_statistic_info (\n" + + "\tcluster_name varchar(16),\n" + + "\ttable_schema varchar(128),\n" + + "\ttable_name varchar(128),\n" + + "\tkey varchar(128),\n" + + "\tvalue varchar(128),\n" + + "\ttable_schema_id varchar(128),\n" + + "\ttable_id varchar(128),\n" + + "\tdata_version bigint,\n" + + "\tcreate_time timestamp,\n" + + "\tupdate_time timestamp\n" + + ")", stmt.toString()); + + } +} \ No newline at end of file