Loading sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/SQLJudgeEngine.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLDescParser.java 0 → 100644 +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; } } sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/statement/DescStatement.java 0 → 100644 +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); } } sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/SQLParserFactory.java +41 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } } sharding-jdbc-core/src/main/java/io/shardingjdbc/core/routing/router/ParsingSQLRouter.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/SQLJudgeEngine.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/sql/MySQLDescParser.java 0 → 100644 +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; } }
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/dialect/mysql/statement/DescStatement.java 0 → 100644 +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); } }
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/sql/SQLParserFactory.java +41 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } }
sharding-jdbc-core/src/main/java/io/shardingjdbc/core/routing/router/ParsingSQLRouter.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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