Commit 4bccaef6 authored by haocao's avatar haocao
Browse files

Fixed #475.

parent 8fae5b36
Loading
Loading
Loading
Loading
+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

### 功能提升
+2 −4
Original line number Diff line number Diff line
@@ -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.");
@@ -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();
+28 −0
Original line number Diff line number Diff line
@@ -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.
     *
@@ -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);
            }
@@ -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;
        }
    }
}
+14 −4
Original line number Diff line number Diff line
@@ -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.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;
@@ -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) {
@@ -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(", ");
+2 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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