diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/dialect/mysql/MySQLKeyword.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/dialect/mysql/MySQLKeyword.java index 355b484e8f4e6..1529645aa489d 100755 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/dialect/mysql/MySQLKeyword.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/dialect/mysql/MySQLKeyword.java @@ -52,7 +52,6 @@ public enum MySQLKeyword implements Keyword { IGNORE, CHANGE, FIRST, - FULLTEXT, SPATIAL, ALGORITHM, CHARACTER, diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/token/DefaultKeyword.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/token/DefaultKeyword.java index ce04a6ea7adbf..a9f61c5b594c2 100755 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/token/DefaultKeyword.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/lexer/token/DefaultKeyword.java @@ -73,6 +73,7 @@ public enum DefaultKeyword implements Keyword { NOSORT, REVERSE, COMPILE, + FULLTEXT, /* Alter diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLCreateParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLCreateParser.java index 3bb6315464bdd..8bc91e2b4fc17 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLCreateParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLCreateParser.java @@ -17,6 +17,7 @@ package io.shardingjdbc.core.parsing.parser.dialect.mysql.sql; +import io.shardingjdbc.core.parsing.lexer.dialect.mysql.MySQLKeyword; import io.shardingjdbc.core.rule.ShardingRule; import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword; import io.shardingjdbc.core.parsing.lexer.token.Keyword; @@ -43,4 +44,9 @@ protected Keyword[] getSkippedKeywordsBetweenCreateAndKeyword() { protected Keyword[] getSkippedKeywordsBetweenCreateTableAndTableName() { return new Keyword[] {DefaultKeyword.IF, DefaultKeyword.NOT, DefaultKeyword.EXISTS}; } + + @Override + protected Keyword[] getSkippedKeywordsBetweenCreateIndexAndKeyword() { + return new Keyword[] {DefaultKeyword.UNIQUE, DefaultKeyword.FULLTEXT, MySQLKeyword.SPATIAL}; + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/oracle/sql/OracleCreateParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/oracle/sql/OracleCreateParser.java index 0e909bc036faa..dc57607d17393 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/oracle/sql/OracleCreateParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/oracle/sql/OracleCreateParser.java @@ -43,4 +43,9 @@ protected Keyword[] getSkippedKeywordsBetweenCreateAndKeyword() { protected Keyword[] getSkippedKeywordsBetweenCreateTableAndTableName() { return new Keyword[] {}; } + + @Override + protected Keyword[] getSkippedKeywordsBetweenCreateIndexAndKeyword() { + return new Keyword[] {DefaultKeyword.UNIQUE, DefaultKeyword.BITMAP}; + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/postgresql/sql/PostgreSQLCreateParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/postgresql/sql/PostgreSQLCreateParser.java index 0a2578f1ca940..87cc696caf2c6 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/postgresql/sql/PostgreSQLCreateParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/postgresql/sql/PostgreSQLCreateParser.java @@ -44,4 +44,9 @@ protected Keyword[] getSkippedKeywordsBetweenCreateAndKeyword() { protected Keyword[] getSkippedKeywordsBetweenCreateTableAndTableName() { return new Keyword[] {DefaultKeyword.IF, DefaultKeyword.NOT, DefaultKeyword.EXISTS}; } + + @Override + protected Keyword[] getSkippedKeywordsBetweenCreateIndexAndKeyword() { + return new Keyword[] {DefaultKeyword.UNIQUE}; + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/sqlserver/sql/SQLServerCreateParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/sqlserver/sql/SQLServerCreateParser.java index 7732c237a6ad8..34ff5e6a6148b 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/sqlserver/sql/SQLServerCreateParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/sqlserver/sql/SQLServerCreateParser.java @@ -17,10 +17,11 @@ package io.shardingjdbc.core.parsing.parser.dialect.sqlserver.sql; -import io.shardingjdbc.core.rule.ShardingRule; -import io.shardingjdbc.core.parsing.lexer.token.Keyword; import io.shardingjdbc.core.parsing.lexer.LexerEngine; +import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword; +import io.shardingjdbc.core.parsing.lexer.token.Keyword; import io.shardingjdbc.core.parsing.parser.sql.ddl.create.AbstractCreateParser; +import io.shardingjdbc.core.rule.ShardingRule; /** * Create parser for SQLServer. @@ -42,4 +43,9 @@ protected Keyword[] getSkippedKeywordsBetweenCreateAndKeyword() { protected Keyword[] getSkippedKeywordsBetweenCreateTableAndTableName() { return new Keyword[] {}; } + + @Override + protected Keyword[] getSkippedKeywordsBetweenCreateIndexAndKeyword() { + return new Keyword[] {DefaultKeyword.UNIQUE, DefaultKeyword.FULLTEXT}; + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java index 79ad585009009..8a2229c7639ed 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java @@ -17,13 +17,13 @@ package io.shardingjdbc.core.parsing.parser.sql.ddl.create; -import io.shardingjdbc.core.rule.ShardingRule; import io.shardingjdbc.core.parsing.lexer.LexerEngine; import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword; import io.shardingjdbc.core.parsing.lexer.token.Keyword; import io.shardingjdbc.core.parsing.parser.clause.TableReferencesClauseParser; import io.shardingjdbc.core.parsing.parser.sql.SQLParser; import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement; +import io.shardingjdbc.core.rule.ShardingRule; import lombok.AccessLevel; import lombok.Getter; @@ -50,9 +50,15 @@ public AbstractCreateParser(final ShardingRule shardingRule, final LexerEngine l @Override public DDLStatement parse() { lexerEngine.nextToken(); + lexerEngine.skipAll(getSkippedKeywordsBetweenCreateIndexAndKeyword()); lexerEngine.skipAll(getSkippedKeywordsBetweenCreateAndKeyword()); - lexerEngine.unsupportedIfNotSkip(DefaultKeyword.TABLE); - lexerEngine.skipAll(getSkippedKeywordsBetweenCreateTableAndTableName()); + if (lexerEngine.equalAny(DefaultKeyword.INDEX)) { + lexerEngine.skipUntil(DefaultKeyword.ON); + lexerEngine.nextToken(); + } else { + lexerEngine.unsupportedIfNotSkip(DefaultKeyword.TABLE); + lexerEngine.skipAll(getSkippedKeywordsBetweenCreateTableAndTableName()); + } DDLStatement result = new DDLStatement(); tableReferencesClauseParser.parse(result, true); return result; @@ -61,4 +67,6 @@ public DDLStatement parse() { protected abstract Keyword[] getSkippedKeywordsBetweenCreateAndKeyword(); protected abstract Keyword[] getSkippedKeywordsBetweenCreateTableAndTableName(); + + protected abstract Keyword[] getSkippedKeywordsBetweenCreateIndexAndKeyword(); } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/drop/AbstractDropParser.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/drop/AbstractDropParser.java index 3fa6047f6cef4..9a234604eda06 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/drop/AbstractDropParser.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/drop/AbstractDropParser.java @@ -50,9 +50,14 @@ public AbstractDropParser(final ShardingRule shardingRule, final LexerEngine lex @Override public DDLStatement parse() { lexerEngine.nextToken(); - lexerEngine.skipAll(getSkippedKeywordsBetweenDropAndTable()); - lexerEngine.unsupportedIfNotSkip(DefaultKeyword.TABLE); - lexerEngine.skipAll(getSkippedKeywordsBetweenDropTableAndTableName()); + if (lexerEngine.equalAny(DefaultKeyword.INDEX)) { + lexerEngine.skipUntil(DefaultKeyword.ON); + lexerEngine.nextToken(); + } else { + lexerEngine.skipAll(getSkippedKeywordsBetweenDropAndTable()); + lexerEngine.unsupportedIfNotSkip(DefaultKeyword.TABLE); + lexerEngine.skipAll(getSkippedKeywordsBetweenDropTableAndTableName()); + } DDLStatement result = new DDLStatement(); tableReferencesClauseParser.parse(result, true); return result; diff --git a/sharding-jdbc-core/src/test/resources/parser/create.xml b/sharding-jdbc-core/src/test/resources/parser/create.xml index 26e71f930ac23..b83f288fbeb3e 100644 --- a/sharding-jdbc-core/src/test/resources/parser/create.xml +++ b/sharding-jdbc-core/src/test/resources/parser/create.xml @@ -48,4 +48,20 @@ +` + + + + + + + + + +
+ + + + + diff --git a/sharding-jdbc-core/src/test/resources/parser/drop.xml b/sharding-jdbc-core/src/test/resources/parser/drop.xml index 339c61f79ab8e..9f956a6215036 100644 --- a/sharding-jdbc-core/src/test/resources/parser/drop.xml +++ b/sharding-jdbc-core/src/test/resources/parser/drop.xml @@ -46,4 +46,12 @@ + + +
+ + + + + diff --git a/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml b/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml index bf5d96a61b050..7796806f12577 100644 --- a/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml +++ b/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml @@ -6,4 +6,6 @@ + + diff --git a/sharding-jdbc-core/src/test/resources/sql/ddl/drop.xml b/sharding-jdbc-core/src/test/resources/sql/ddl/drop.xml index dd0cc587e1f55..f3dd4e8e79077 100644 --- a/sharding-jdbc-core/src/test/resources/sql/ddl/drop.xml +++ b/sharding-jdbc-core/src/test/resources/sql/ddl/drop.xml @@ -6,4 +6,5 @@ +