Loading RELEASE-NOTES.md +5 −0 Original line number Diff line number Diff line ## 2.0.2 ### 功能提升 1. [ISSUE #475](https://github.com/shardingjdbc/sharding-jdbc/issues/475) 支持create index语句 ## 2.0.1 ### 功能提升 Loading sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java +2 −4 Original line number Diff line number Diff line Loading @@ -56,10 +56,9 @@ public abstract class AbstractCreateParser implements SQLParser { 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."); Loading @@ -69,7 +68,6 @@ public abstract class AbstractCreateParser implements SQLParser { } private void parseIndex(final DDLStatement ddlStatement) { lexerEngine.nextToken(); Token currentToken = lexerEngine.getCurrentToken(); int beginPosition = currentToken.getEndPosition() - currentToken.getLiterals().length(); String literals = currentToken.getLiterals(); Loading sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java +28 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,18 @@ public final class SQLBuilder { 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. * Loading @@ -77,6 +89,9 @@ public final class SQLBuilder { 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); } Loading @@ -94,4 +109,17 @@ public final class SQLBuilder { return tableName; } } @RequiredArgsConstructor private class IndexToken { private final String indexName; private final String tableName; @Override public String toString() { return indexName; } } } sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java +14 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -34,7 +33,8 @@ import io.shardingjdbc.core.parsing.parser.token.SQLToken; 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; Loading Loading @@ -99,6 +99,8 @@ public final class SQLRewriteEngine { } 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) { Loading @@ -124,13 +126,21 @@ public final class SQLRewriteEngine { } private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> 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<SQLToken> 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<SQLToken> sqlTokens) { for (String item : itemsToken.getItems()) { sqlBuilder.appendLiterals(", "); Loading sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ public abstract class AbstractShardingTableOnlyTest extends AbstractSQLAssertTes @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 { Loading @@ -108,7 +108,7 @@ public abstract class AbstractShardingTableOnlyTest extends AbstractSQLAssertTes @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 { Loading Loading
RELEASE-NOTES.md +5 −0 Original line number Diff line number Diff line ## 2.0.2 ### 功能提升 1. [ISSUE #475](https://github.com/shardingjdbc/sharding-jdbc/issues/475) 支持create index语句 ## 2.0.1 ### 功能提升 Loading
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/ddl/create/AbstractCreateParser.java +2 −4 Original line number Diff line number Diff line Loading @@ -56,10 +56,9 @@ public abstract class AbstractCreateParser implements SQLParser { 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."); Loading @@ -69,7 +68,6 @@ public abstract class AbstractCreateParser implements SQLParser { } private void parseIndex(final DDLStatement ddlStatement) { lexerEngine.nextToken(); Token currentToken = lexerEngine.getCurrentToken(); int beginPosition = currentToken.getEndPosition() - currentToken.getLiterals().length(); String literals = currentToken.getLiterals(); Loading
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLBuilder.java +28 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,18 @@ public final class SQLBuilder { 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. * Loading @@ -77,6 +89,9 @@ public final class SQLBuilder { 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); } Loading @@ -94,4 +109,17 @@ public final class SQLBuilder { return tableName; } } @RequiredArgsConstructor private class IndexToken { private final String indexName; private final String tableName; @Override public String toString() { return indexName; } } }
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/rewrite/SQLRewriteEngine.java +14 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -34,7 +33,8 @@ import io.shardingjdbc.core.parsing.parser.token.SQLToken; 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; Loading Loading @@ -99,6 +99,8 @@ public final class SQLRewriteEngine { } 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) { Loading @@ -124,13 +126,21 @@ public final class SQLRewriteEngine { } private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> 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<SQLToken> 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<SQLToken> sqlTokens) { for (String item : itemsToken.getItems()) { sqlBuilder.appendLiterals(", "); Loading
sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingTableOnlyTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ public abstract class AbstractShardingTableOnlyTest extends AbstractSQLAssertTes @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 { Loading @@ -108,7 +108,7 @@ public abstract class AbstractShardingTableOnlyTest extends AbstractSQLAssertTes @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 { Loading