diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java new file mode 100644 index 0000000000..0af62e02fd --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java @@ -0,0 +1,8 @@ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; + + +public interface SQLPartitioningClause extends OracleSQLObject { + +} 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 30cfc4bec9..2a662b680c 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 @@ -83,7 +83,9 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { MySqlTableIndex idx = new MySqlTableIndex(); if (lexer.token() == Token.IDENTIFIER) { - idx.setName(this.exprParser.name()); + if (!"USING".equalsIgnoreCase(lexer.stringVal())) { + idx.setName(this.exprParser.name()); + } } if (identifierEquals("USING")) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java index 2ac49f637b..b5074ff199 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java @@ -5,10 +5,11 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLPartitioningClause; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -public class OraclePartitionByRangeClause extends OracleSQLObjectImpl implements OraclePartitioningClause { +public class OraclePartitionByRangeClause extends OracleSQLObjectImpl implements SQLPartitioningClause { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitioningClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitioningClause.java deleted file mode 100644 index 9b100b4f61..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitioningClause.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.alibaba.druid.sql.dialect.oracle.ast.clause; - -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; - - -public interface OraclePartitioningClause extends OracleSQLObject { - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index 542eb4561b..c95f5c86cb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -2,9 +2,9 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLPartitioningClause; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitioningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -40,13 +40,13 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen private Boolean cache; - private OraclePartitioningClause partitioning; + private SQLPartitioningClause partitioning; - public OraclePartitioningClause getPartitioning() { + public SQLPartitioningClause getPartitioning() { return partitioning; } - public void setPartitioning(OraclePartitioningClause partitioning) { + public void setPartitioning(SQLPartitioningClause partitioning) { this.partitioning = partitioning; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest1.java new file mode 100644 index 0000000000..9e5ce43327 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest1.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +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 com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest1 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE lookup" + // + " (id INT, INDEX USING BTREE (id))" + // + " ENGINE = MEMORY;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.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(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("lookup"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("lookup", "id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest2.java new file mode 100644 index 0000000000..77c6d18468 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest2.java @@ -0,0 +1,42 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +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 com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest2 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.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(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "blob_col"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest3.java new file mode 100644 index 0000000000..d23d6e7b1e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest3.java @@ -0,0 +1,42 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +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 com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest3 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY KEY(col3) PARTITIONS 4;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.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(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("test", "blob_col"))); + } +}