Commit e1844fb4 authored by terrymanu's avatar terrymanu
Browse files

fixed #611

parent a35a8fc5
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import io.shardingjdbc.core.parsing.lexer.token.Assist;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
import io.shardingjdbc.core.parsing.lexer.token.Keyword;
import io.shardingjdbc.core.parsing.lexer.token.TokenType;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.DescStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowType;
import io.shardingjdbc.core.parsing.parser.exception.SQLParsingException;
@@ -73,6 +74,9 @@ public final class SQLJudgeEngine {
                if (DefaultKeyword.USE == tokenType) {
                    return new IgnoreStatement();
                }
                if (DefaultKeyword.DESC == tokenType) {
                    return new DescStatement();
                }
                if (MySQLKeyword.SHOW == tokenType) {
                    return new ShowStatement(ShowType.OTHER);
                }
+32 −0
Original line number Diff line number Diff line
package io.shardingjdbc.core.parsing.parser.dialect.mysql.sql;

import io.shardingjdbc.core.parsing.lexer.LexerEngine;
import io.shardingjdbc.core.parsing.parser.clause.TableReferencesClauseParser;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.DescStatement;
import io.shardingjdbc.core.parsing.parser.sql.SQLParser;
import io.shardingjdbc.core.rule.ShardingRule;

/**
 * Desc parser for MySQL.
 *
 * @author zhangliang
 */
public final class MySQLDescParser implements SQLParser {
    
    private final LexerEngine lexerEngine;
    
    private final TableReferencesClauseParser tableReferencesClauseParser;
    
    public MySQLDescParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) {
        this.lexerEngine = lexerEngine;
        tableReferencesClauseParser = new TableReferencesClauseParser(shardingRule, lexerEngine);
    }
    
    @Override
    public DescStatement parse() {
        lexerEngine.nextToken();
        DescStatement result = new DescStatement();
        tableReferencesClauseParser.parseSingleTableWithoutAlias(result);
        return result;
    }
}
+18 −0
Original line number Diff line number Diff line
package io.shardingjdbc.core.parsing.parser.dialect.mysql.statement;

import io.shardingjdbc.core.constant.SQLType;
import io.shardingjdbc.core.parsing.parser.sql.AbstractSQLStatement;
import lombok.Getter;

/**
 * Desc statement.
 *
 * @author zhangliang
 */
@Getter
public final class DescStatement extends AbstractSQLStatement {
    
    public DescStatement() {
        super(SQLType.OTHER);
    }
}
+41 −21
Original line number Diff line number Diff line
@@ -17,11 +17,14 @@

package io.shardingjdbc.core.parsing.parser.sql;

import com.google.common.base.Optional;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.parsing.lexer.LexerEngine;
import io.shardingjdbc.core.parsing.lexer.dialect.mysql.MySQLKeyword;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
import io.shardingjdbc.core.parsing.lexer.token.Keyword;
import io.shardingjdbc.core.parsing.lexer.token.TokenType;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.sql.MySQLDescParser;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.sql.MySQLShowParser;
import io.shardingjdbc.core.parsing.parser.exception.SQLParsingUnsupportedException;
import io.shardingjdbc.core.parsing.parser.sql.ddl.alter.AlterParserFactory;
@@ -57,51 +60,68 @@ public final class SQLParserFactory {
     */
    public static SQLParser newInstance(final DatabaseType dbType, final TokenType tokenType, final ShardingRule shardingRule, final LexerEngine lexerEngine) {
        if (tokenType instanceof DefaultKeyword) {
            return getGenericParser(dbType, (DefaultKeyword) tokenType, shardingRule, lexerEngine);
            Optional<? extends SQLParser> result = getGenericParser(dbType, (DefaultKeyword) tokenType, shardingRule, lexerEngine);
            if (result.isPresent()) {
                return result.get();
            }
        }
        if (DatabaseType.MySQL == dbType) {
            Optional<? extends SQLParser> result = getMySQLParser((Keyword) tokenType, shardingRule, lexerEngine);
            if (result.isPresent()) {
                return result.get();
            }
        if (DatabaseType.MySQL == dbType && tokenType instanceof MySQLKeyword) {
            return getMySQLParser((MySQLKeyword) tokenType, lexerEngine);
        }
        throw new SQLParsingUnsupportedException(tokenType);
    }
    
    private static SQLParser getGenericParser(final DatabaseType dbType, final DefaultKeyword tokenType, final ShardingRule shardingRule, final LexerEngine lexerEngine) {
    private static Optional<? extends SQLParser> getGenericParser(final DatabaseType dbType, final DefaultKeyword tokenType, final ShardingRule shardingRule, final LexerEngine lexerEngine) {
        switch (tokenType) {
            case SELECT:
                return SelectParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(SelectParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case INSERT:
                return InsertParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(InsertParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case UPDATE:
                return UpdateParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(UpdateParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case DELETE:
                return DeleteParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(DeleteParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case CREATE:
                return CreateParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(CreateParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case ALTER:
                return AlterParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(AlterParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case DROP:
                return DropParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(DropParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case TRUNCATE:
                return TruncateParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(TruncateParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case SET:
            case COMMIT:
            case ROLLBACK:
            case SAVEPOINT:
            case BEGIN:
                return TCLParserFactory.newInstance(dbType, shardingRule, lexerEngine);
                return Optional.of(TCLParserFactory.newInstance(dbType, shardingRule, lexerEngine));
            case USE:
                return new IgnoreParser();
                return Optional.of(new IgnoreParser());
            default:
                throw new SQLParsingUnsupportedException(lexerEngine.getCurrentToken().getType());
                return Optional.absent();
        }
    }
    
    private static SQLParser getMySQLParser(final MySQLKeyword tokenType, final LexerEngine lexerEngine) {
        switch (tokenType) {
    private static  Optional<? extends SQLParser> getMySQLParser(final Keyword tokenType, final ShardingRule shardingRule, final LexerEngine lexerEngine) {
        if (tokenType instanceof DefaultKeyword) {
            switch ((DefaultKeyword) tokenType) {
                case DESC:
                    return Optional.of(new MySQLDescParser(shardingRule, lexerEngine));
                default:
                    return Optional.absent();
            }
        }
        if (tokenType instanceof MySQLKeyword) {
            switch ((MySQLKeyword) tokenType) {
                case SHOW:
                return new MySQLShowParser(lexerEngine);
                    return Optional.of(new MySQLShowParser(lexerEngine));
                default:
                throw new SQLParsingUnsupportedException(lexerEngine.getCurrentToken().getType());
                    return Optional.absent();
            }
        }
        return Optional.absent();
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.jdbc.core.ShardingContext;
import io.shardingjdbc.core.parsing.SQLParsingEngine;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.DescStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowStatement;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
@@ -43,6 +44,7 @@ import io.shardingjdbc.core.routing.type.ddl.DDLRoutingEngine;
import io.shardingjdbc.core.routing.type.ignore.IgnoreRoutingEngine;
import io.shardingjdbc.core.routing.type.show.ShowRoutingEngine;
import io.shardingjdbc.core.routing.type.simple.SimpleRoutingEngine;
import io.shardingjdbc.core.routing.type.unicast.UnicastRoutingEngine;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.util.SQLLogger;

@@ -121,6 +123,8 @@ public final class ParsingSQLRouter implements SQLRouter {
            routingEngine = new DDLRoutingEngine(shardingRule, parameters, (DDLStatement) sqlStatement);
        } else if (sqlStatement instanceof ShowStatement) {
            routingEngine = new ShowRoutingEngine(shardingRule.getDataSourceMap(), (ShowStatement) sqlStatement);
        } else if (sqlStatement instanceof DescStatement) {
            routingEngine = new UnicastRoutingEngine(shardingRule, sqlStatement);
        } else if (tableNames.isEmpty()) {
            routingEngine = new DatabaseAllRoutingEngine(shardingRule.getDataSourceMap());
        } else if (1 == tableNames.size() || shardingRule.isAllBindingTables(tableNames) || shardingRule.isAllInDefaultDataSource(tableNames)) {
Loading