diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index c6c9d38e7faaf..1f68bd34845b0 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,8 @@ +## 2.0.2 + +### 功能提升 +1. [ISSUE #475](https://github.com/shardingjdbc/sharding-jdbc/issues/475) 支持create index语句 + ## 2.0.1 ### 功能提升 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 e6b494c2cd328..c0c1f307d1bdd 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 @@ -56,10 +56,9 @@ public DDLStatement parse() { lexerEngine.skipAll(getSkippedKeywordsBetweenCreateIndexAndKeyword()); lexerEngine.skipAll(getSkippedKeywordsBetweenCreateAndKeyword()); DDLStatement result = new DDLStatement(); - if (lexerEngine.equalAny(DefaultKeyword.INDEX)) { + if (lexerEngine.skipIfEqual(DefaultKeyword.INDEX)) { parseIndex(result); - } else if (lexerEngine.equalAny(DefaultKeyword.TABLE)) { - lexerEngine.nextToken(); + } else if (lexerEngine.skipIfEqual(DefaultKeyword.TABLE)) { lexerEngine.skipAll(getSkippedKeywordsBetweenCreateTableAndTableName()); } else { throw new SQLParsingException("Can't support other CREATE grammar unless CREATE TABLE, CREATE INDEX."); @@ -69,7 +68,6 @@ public DDLStatement parse() { } private void parseIndex(final DDLStatement ddlStatement) { - lexerEngine.nextToken(); Token currentToken = lexerEngine.getCurrentToken(); int beginPosition = currentToken.getEndPosition() - currentToken.getLiterals().length(); String literals = currentToken.getLiterals(); diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java index 9e427212a54cc..48e711f594283 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java @@ -55,6 +55,18 @@ public void appendLiterals(final String literals) { currentSegment.append(literals); } + /** + * Append index token. + * + * @param indexName index name + * @param tableName table name + */ + public void appendIndex(final String indexName, final String tableName) { + segments.add(new IndexToken(indexName, tableName)); + currentSegment = new StringBuilder(); + segments.add(currentSegment); + } + /** * Append table token. * @@ -77,6 +89,9 @@ public String toSQL(final Map tableTokens) { for (Object each : segments) { if (each instanceof TableToken && tableTokens.containsKey(((TableToken) each).tableName)) { result.append(tableTokens.get(((TableToken) each).tableName)); + } else if (each instanceof IndexToken) { + IndexToken indexToken = (IndexToken) each; + result.append(indexToken.indexName + "_" + tableTokens.get(indexToken.tableName)); } else { result.append(each); } @@ -94,4 +109,17 @@ public String toString() { return tableName; } } + + @RequiredArgsConstructor + private class IndexToken { + + private final String indexName; + + private final String tableName; + + @Override + public String toString() { + return indexName; + } + } } diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java index 94dc8b1af312d..9559dc6274fcc 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java @@ -17,15 +17,14 @@ package io.shardingjdbc.core.rewrite; - +import com.google.common.base.Optional; import io.shardingjdbc.core.constant.DatabaseType; -import io.shardingjdbc.core.rule.BindingTableRule; -import io.shardingjdbc.core.rule.ShardingRule; import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword; import io.shardingjdbc.core.parsing.parser.context.OrderItem; import io.shardingjdbc.core.parsing.parser.context.limit.Limit; import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement; +import io.shardingjdbc.core.parsing.parser.token.IndexToken; import io.shardingjdbc.core.parsing.parser.token.ItemsToken; import io.shardingjdbc.core.parsing.parser.token.OffsetToken; import io.shardingjdbc.core.parsing.parser.token.OrderByToken; @@ -34,7 +33,8 @@ import io.shardingjdbc.core.parsing.parser.token.TableToken; import io.shardingjdbc.core.routing.type.TableUnit; import io.shardingjdbc.core.routing.type.complex.CartesianTableReference; -import com.google.common.base.Optional; +import io.shardingjdbc.core.rule.BindingTableRule; +import io.shardingjdbc.core.rule.ShardingRule; import io.shardingjdbc.core.util.SQLUtil; import java.util.Collections; @@ -99,6 +99,8 @@ public SQLBuilder rewrite(final boolean isRewriteLimit) { } if (each instanceof TableToken) { appendTableToken(result, (TableToken) each, count, sqlTokens); + } else if (each instanceof IndexToken) { + appendIndexToken(result, (IndexToken) each, count, sqlTokens); } else if (each instanceof ItemsToken) { appendItemsToken(result, (ItemsToken) each, count, sqlTokens); } else if (each instanceof RowCountToken) { @@ -124,13 +126,21 @@ public int compare(final SQLToken o1, final SQLToken o2) { } private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List sqlTokens) { + // TODO simplify String tableName = SQLUtil.getOriginalValue(sqlStatement.getTables().getTableNames().contains(tableToken.getTableName()) ? tableToken.getTableName() : tableToken.getOriginalLiterals(), databaseType); +// String tableName = tableToken.getTableName(); sqlBuilder.appendTable(tableName); int beginPosition = tableToken.getBeginPosition() + tableToken.getOriginalLiterals().length(); appendRest(sqlBuilder, count, sqlTokens, beginPosition); } + private void appendIndexToken(final SQLBuilder sqlBuilder, final IndexToken indexToken, final int count, final List sqlTokens) { + sqlBuilder.appendIndex(indexToken.getIndexName(), indexToken.getTableName()); + int beginPosition = indexToken.getBeginPosition() + indexToken.getOriginalLiterals().length(); + appendRest(sqlBuilder, count, sqlTokens, beginPosition); + } + private void appendItemsToken(final SQLBuilder sqlBuilder, final ItemsToken itemsToken, final int count, final List sqlTokens) { for (String item : itemsToken.getItems()) { sqlBuilder.appendLiterals(", "); diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java index a95c5d5765458..8fd801dfe1828 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java @@ -97,7 +97,7 @@ protected final Map getDataSources() throws SQ @Before public void initDDLTables() throws SQLException { - if (getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP TABLE")) { + if (getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("DROP TABLE") || getSql().startsWith("CREATE INDEX") || getSql().startsWith("CREATE UNIQUE INDEX")) { if (getSql().contains("TEMP")) { executeSql("CREATE TEMPORARY TABLE t_temp_log(id int, status varchar(10))"); } else { @@ -108,7 +108,7 @@ public void initDDLTables() throws SQLException { @After public void cleanupDdlTables() throws SQLException { - if (getSql().startsWith("CREATE TABLE") || getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE")) { + if (getSql().startsWith("CREATE TABLE") || getSql().startsWith("ALTER") || getSql().startsWith("TRUNCATE") || getSql().startsWith("CREATE INDEX") || getSql().startsWith("CREATE UNIQUE INDEX")) { if (getSql().contains("TEMP")) { executeSql("DROP TABLE t_temp_log"); } else { diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/parsing/parser/jaxb/helper/ParserAssertHelper.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/parsing/parser/jaxb/helper/ParserAssertHelper.java index 5d0ac56a4d6de..e7157e0f3b43f 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/parsing/parser/jaxb/helper/ParserAssertHelper.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/parsing/parser/jaxb/helper/ParserAssertHelper.java @@ -88,12 +88,16 @@ public static void assertSqlTokens(final List expectedSqlTokens = buildExpectedSqlTokens(expected, isPreparedStatement); + assertTrue(expectedSqlTokens.size() == actual.size()); for (SQLToken each : actual) { + boolean hasData = false; for (SQLToken sqlToken : expectedSqlTokens) { if (each.getBeginPosition() == sqlToken.getBeginPosition()) { + hasData = true; assertTrue(EqualsBuilder.reflectionEquals(sqlToken, each)); } } + assertTrue(hasData); } } diff --git a/sharding-jdbc-core/src/test/resources/integrate/assert/create.xml b/sharding-jdbc-core/src/test/resources/integrate/assert/create.xml index ceff0fee4a01c..5662b553d0553 100644 --- a/sharding-jdbc-core/src/test/resources/integrate/assert/create.xml +++ b/sharding-jdbc-core/src/test/resources/integrate/assert/create.xml @@ -30,4 +30,14 @@ + + + + + + + + + + diff --git a/sharding-jdbc-core/src/test/resources/integrate/dataset/sharding/tbl/expect/index/tbl.xml b/sharding-jdbc-core/src/test/resources/integrate/dataset/sharding/tbl/expect/index/tbl.xml new file mode 100644 index 0000000000000..fb0854fccbe68 --- /dev/null +++ b/sharding-jdbc-core/src/test/resources/integrate/dataset/sharding/tbl/expect/index/tbl.xml @@ -0,0 +1,2 @@ + + diff --git a/sharding-jdbc-core/src/test/resources/parser/create.xml b/sharding-jdbc-core/src/test/resources/parser/create.xml index 8b6f5b70db5eb..364fd6d4917bc 100644 --- a/sharding-jdbc-core/src/test/resources/parser/create.xml +++ b/sharding-jdbc-core/src/test/resources/parser/create.xml @@ -61,9 +61,9 @@ + - - + 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 05cda2f34435d..d661e961cb8ec 100644 --- a/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml +++ b/sharding-jdbc-core/src/test/resources/sql/ddl/create.xml @@ -7,5 +7,5 @@ - +