diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java index d1324ac2b49e49d7a745fcb5fa348d76e29377ba..f49ff232e17e189e569e53a5a251111b69726233 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/mysql/MySQLSelectParser.java @@ -31,6 +31,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingExce import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.AbstractOrderBySQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.DistinctSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.GroupBySQLParser; +import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.HavingSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.SelectListSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.WhereSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.AbstractSelectParser; @@ -51,6 +52,8 @@ public final class MySQLSelectParser extends AbstractSelectParser { private final GroupBySQLParser groupBySQLParser; + private final HavingSQLParser havingSQLParser; + private final AbstractOrderBySQLParser orderBySQLParser; public MySQLSelectParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) { @@ -58,6 +61,7 @@ public final class MySQLSelectParser extends AbstractSelectParser { distinctSQLParser = new MySQLDistinctSQLParser(lexerEngine); selectListSQLParser = new SelectListSQLParser(shardingRule, lexerEngine); groupBySQLParser = new MySQLGroupBySQLParser(lexerEngine); + havingSQLParser = new HavingSQLParser(lexerEngine); orderBySQLParser = new MySQLOrderBySQLParser(lexerEngine); } @@ -69,7 +73,7 @@ public final class MySQLSelectParser extends AbstractSelectParser { parseFrom(selectStatement); parseWhere(selectStatement); groupBySQLParser.parse(selectStatement); - parseHaving(); + havingSQLParser.parse(); orderBySQLParser.parse(selectStatement); parseLimit(selectStatement); parseRest(); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java index 0d4139e9f1900916ad0ba999fc33008fd7328836..30e40e4803e6c0db1b3dc086576c0c1dddcbc9fa 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleSelectParser.java @@ -27,6 +27,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsu import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.AbstractOrderBySQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.DistinctSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.GroupBySQLParser; +import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.HavingSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.SelectListSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.AbstractSelectParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectStatement; @@ -46,6 +47,8 @@ public final class OracleSelectParser extends AbstractSelectParser { private final GroupBySQLParser groupBySQLParser; + private final HavingSQLParser havingSQLParser; + private final AbstractOrderBySQLParser orderBySQLParser; public OracleSelectParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) { @@ -53,6 +56,7 @@ public final class OracleSelectParser extends AbstractSelectParser { distinctSQLParser = new OracleDistinctSQLParser(lexerEngine); selectListSQLParser = new OracleSelectListSQLParser(shardingRule, lexerEngine); groupBySQLParser = new OracleGroupBySQLParser(lexerEngine); + havingSQLParser = new HavingSQLParser(lexerEngine); orderBySQLParser = new OracleOrderBySQLParser(lexerEngine); } @@ -64,7 +68,7 @@ public final class OracleSelectParser extends AbstractSelectParser { parseWhere(selectStatement); skipHierarchicalQueryClause(selectStatement); groupBySQLParser.parse(selectStatement); - parseHaving(); + havingSQLParser.parse(); skipModelClause(selectStatement); orderBySQLParser.parse(selectStatement); skipFor(selectStatement); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/postgresql/PostgreSQLSelectParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/postgresql/PostgreSQLSelectParser.java index 69dde6f7dbf197adfc30b490063d53cced177ef5..1b02053a7b056af50519f49dde5270fde0982d84 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/postgresql/PostgreSQLSelectParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/postgresql/PostgreSQLSelectParser.java @@ -31,6 +31,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsu import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.AbstractOrderBySQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.DistinctSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.GroupBySQLParser; +import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.HavingSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.SelectListSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.WhereSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.AbstractSelectParser; @@ -53,6 +54,8 @@ public final class PostgreSQLSelectParser extends AbstractSelectParser { private final GroupBySQLParser groupBySQLParser; + private final HavingSQLParser havingSQLParser; + private final AbstractOrderBySQLParser orderBySQLParser; public PostgreSQLSelectParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) { @@ -60,6 +63,7 @@ public final class PostgreSQLSelectParser extends AbstractSelectParser { distinctSQLParser = new DistinctSQLParser(lexerEngine); selectListSQLParser = new SelectListSQLParser(shardingRule, lexerEngine); groupBySQLParser = new GroupBySQLParser(lexerEngine); + havingSQLParser = new HavingSQLParser(lexerEngine); orderBySQLParser = new PostgreSQLOrderBySQLParser(lexerEngine); } @@ -70,7 +74,7 @@ public final class PostgreSQLSelectParser extends AbstractSelectParser { parseFrom(selectStatement); parseWhere(selectStatement); groupBySQLParser.parse(selectStatement); - parseHaving(); + havingSQLParser.parse(); orderBySQLParser.parse(selectStatement); parseLimit(selectStatement); parseFor(); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java index 69bf9b93e1a25cb08cfad1c1ce842b7a642281f7..2bdcb4c98bcf5a1c4db4cc80d08b2f04062dd816 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/sqlserver/SQLServerSelectParser.java @@ -34,6 +34,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholde import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.AbstractOrderBySQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.DistinctSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.GroupBySQLParser; +import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.HavingSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.SelectListSQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.AbstractSelectParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.dql.select.SelectStatement; @@ -52,6 +53,8 @@ public final class SQLServerSelectParser extends AbstractSelectParser { private final GroupBySQLParser groupBySQLParser; + private final HavingSQLParser havingSQLParser; + private final AbstractOrderBySQLParser orderBySQLParser; public SQLServerSelectParser(final ShardingRule shardingRule, final LexerEngine lexerEngine) { @@ -59,6 +62,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser { distinctSQLParser = new DistinctSQLParser(lexerEngine); selectListSQLParser = new SQLServerSelectListSQLParser(shardingRule, lexerEngine); groupBySQLParser = new GroupBySQLParser(lexerEngine); + havingSQLParser = new HavingSQLParser(lexerEngine); orderBySQLParser = new MySQLOrderBySQLParser(lexerEngine); } @@ -70,7 +74,7 @@ public final class SQLServerSelectParser extends AbstractSelectParser { parseFrom(selectStatement); parseWhere(selectStatement); groupBySQLParser.parse(selectStatement); - parseHaving(); + havingSQLParser.parse(); orderBySQLParser.parse(selectStatement); parseOffset(selectStatement); parseFor(); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/sql/HavingSQLParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/sql/HavingSQLParser.java new file mode 100644 index 0000000000000000000000000000000000000000..def036053afee4b025f6747a161d61317cce143e --- /dev/null +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/sql/HavingSQLParser.java @@ -0,0 +1,26 @@ +package com.dangdang.ddframe.rdb.sharding.parsing.parser.sql; + +import com.dangdang.ddframe.rdb.sharding.parsing.lexer.LexerEngine; +import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword; +import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException; +import lombok.RequiredArgsConstructor; + +/** + * Having解析器. + * + * @author zhangliang + */ +@RequiredArgsConstructor +public final class HavingSQLParser implements SQLParser { + + private final LexerEngine lexerEngine; + + /** + * 解析Having. + */ + public void parse() { + if (lexerEngine.equalAny(DefaultKeyword.HAVING)) { + throw new SQLParsingUnsupportedException(DefaultKeyword.HAVING); + } + } +} diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java index 9b5ed35fb3c80273830c690a6d3ea65838baf15c..6f4b635daca057b46a5db4d3ee3caae8ec618566 100755 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/dql/select/AbstractSelectParser.java @@ -174,12 +174,6 @@ public abstract class AbstractSelectParser implements SQLStatementParser { parametersIndex = selectStatement.getParametersIndex(); } - protected final void parseHaving() { - if (lexerEngine.equalAny(DefaultKeyword.HAVING)) { - throw new SQLParsingUnsupportedException(DefaultKeyword.HAVING); - } - } - protected final void parseRest() { Collection unsupportedRestKeywords = new LinkedList<>(); unsupportedRestKeywords.addAll(Arrays.asList(DefaultKeyword.UNION, DefaultKeyword.INTERSECT, DefaultKeyword.EXCEPT, DefaultKeyword.MINUS));