Skip to content

Commit

Permalink
Fixed #475.
Browse files Browse the repository at this point in the history
  • Loading branch information
haocao committed Dec 27, 2017
1 parent 8fae5b3 commit 4bccaef
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 13 deletions.
5 changes: 5 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 2.0.2

### 功能提升
1. [ISSUE #475](https://github.com/shardingjdbc/sharding-jdbc/issues/475) 支持create index语句

## 2.0.1

### 功能提升
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand All @@ -77,6 +89,9 @@ public String toSQL(final Map<String, String> 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);
}
Expand All @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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<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(", ");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ protected final Map<DatabaseType, ShardingDataSource> 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 {
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,16 @@ public static void assertSqlTokens(final List<io.shardingjdbc.core.parsing.parse
return;
}
List<SQLToken> 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);
}
}

Expand Down
10 changes: 10 additions & 0 deletions sharding-jdbc-core/src/test/resources/integrate/assert/create.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,14 @@
<data expected="create/tbl.xml" />
</sharding-rule>
</sql>
<sql id="assertCreateIndex">
<sharding-rule value="tbl">
<data expected="index/tbl.xml" />
</sharding-rule>
</sql>
<sql id="assertCreateUniqueIndex">
<sharding-rule value="tbl">
<data expected="index/tbl.xml" />
</sharding-rule>
</sql>
</sqls>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<dataset>
</dataset>
4 changes: 2 additions & 2 deletions sharding-jdbc-core/src/test/resources/parser/create.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@
<tables>
<table name="t_log" />
</tables>
<index-token begin-position="20" original-literals="t_log_index" table-name="t_log" />
<table-tokens>
<index-token begin-position="13" original-literals="t_log_index" table-name="t_log" />
<table-token begin-position="37" original-literals="t_log" />
<table-token begin-position="35" original-literals="t_log" />
</table-tokens>
</assert>
</asserts>
2 changes: 1 addition & 1 deletion sharding-jdbc-core/src/test/resources/sql/ddl/create.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
<sql id="assertCreateLocalTempTable" value="CREATE LOCAL TEMP TABLE t_temp_log(id int, status varchar(10))" type="PostgreSQL" />
<sql id="assertCreateUnloggedTable" value="CREATE UNLOGGED TABLE t_log(id int, status varchar(10))" type="PostgreSQL" />
<sql id="assertCreateIndex" value="CREATE INDEX t_log_index ON t_log (id)" />
<sql id="assertCreateUniqueIndex" value="CREATE UNIQUE INDEX t_order_index ON t_log (id)" />
<sql id="assertCreateUniqueIndex" value="CREATE UNIQUE INDEX t_log_index ON t_log (id)" />
</sqls>

0 comments on commit 4bccaef

Please sign in to comment.