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 @@
+