Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java +15 −3 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholde import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPropertyExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLTextExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import com.google.common.base.Optional; Loading Loading @@ -276,8 +277,12 @@ public class SQLParser extends AbstractParser { parseBetweenCondition(sqlStatement, left); return; } if (equalAny(Symbol.LT) || equalAny(Symbol.GT) || equalAny(Symbol.LT_EQ) || equalAny(Symbol.GT_EQ)) { parserOtherCondition(sqlStatement); if (equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isSpecialCondition((SelectStatement) sqlStatement, (SQLIdentifierExpression) left)) { parseSpecialCondition((SelectStatement) sqlStatement); } else { parseOtherCondition(sqlStatement); } } skipIfEqual(Symbol.LEFT_PAREN); } Loading Loading @@ -324,7 +329,14 @@ public class SQLParser extends AbstractParser { } } private void parserOtherCondition(final SQLStatement sqlStatement) { protected boolean isSpecialCondition(final SelectStatement selectStatement, final SQLIdentifierExpression left) { return false; } protected void parseSpecialCondition(final SelectStatement selectStatement) { } private void parseOtherCondition(final SQLStatement sqlStatement) { getLexer().nextToken(); parseExpression(sqlStatement); } Loading sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleParser.java +40 −0 Original line number Diff line number Diff line Loading @@ -20,7 +20,16 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.dialect.oracle; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyword; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleLexer; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol; import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.OffsetLimit; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.RowCountLimit; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholderExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; /** Loading @@ -42,4 +51,35 @@ public final class OracleParser extends SQLParser { } return super.parseAlias(); } @Override protected boolean isSpecialCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { Optional<String> rownumAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "rownum".equalsIgnoreCase(each.getExpression())) { rownumAlias = each.getAlias(); } } return "rownum".equalsIgnoreCase(expression.getName()) || expression.getName().equalsIgnoreCase(rownumAlias.orNull()); } @Override protected void parseSpecialCondition(final SelectStatement selectStatement) { Symbol symbol = (Symbol) getLexer().getCurrentToken().getType(); getLexer().nextToken(); SQLExpression sqlExpression = parseExpression(selectStatement); if (Symbol.LT == symbol || Symbol.LT_EQ == symbol) { if (sqlExpression instanceof SQLNumberExpression) { selectStatement.getLimit().setRowCountLimit(new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1)); } else if (sqlExpression instanceof SQLPlaceholderExpression) { selectStatement.getLimit().setRowCountLimit(new RowCountLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex())); } } else if (Symbol.GT == symbol || Symbol.GT_EQ == symbol) { if (sqlExpression instanceof SQLNumberExpression) { selectStatement.getLimit().setOffsetLimit(new OffsetLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1)); } else if (sqlExpression instanceof SQLPlaceholderExpression) { selectStatement.getLimit().setOffsetLimit(new OffsetLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex())); } } } } sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/select/AbstractSelectParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser { } query(); sqlParser.accept(Symbol.RIGHT_PAREN); if (sqlParser.equalAny(Assist.END)) { if (sqlParser.equalAny(DefaultKeyword.WHERE, Assist.END)) { return; } } Loading Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/SQLParser.java +15 −3 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholde import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPropertyExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLTextExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.SQLStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.dangdang.ddframe.rdb.sharding.parsing.parser.token.TableToken; import com.dangdang.ddframe.rdb.sharding.util.SQLUtil; import com.google.common.base.Optional; Loading Loading @@ -276,8 +277,12 @@ public class SQLParser extends AbstractParser { parseBetweenCondition(sqlStatement, left); return; } if (equalAny(Symbol.LT) || equalAny(Symbol.GT) || equalAny(Symbol.LT_EQ) || equalAny(Symbol.GT_EQ)) { parserOtherCondition(sqlStatement); if (equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) { if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isSpecialCondition((SelectStatement) sqlStatement, (SQLIdentifierExpression) left)) { parseSpecialCondition((SelectStatement) sqlStatement); } else { parseOtherCondition(sqlStatement); } } skipIfEqual(Symbol.LEFT_PAREN); } Loading Loading @@ -324,7 +329,14 @@ public class SQLParser extends AbstractParser { } } private void parserOtherCondition(final SQLStatement sqlStatement) { protected boolean isSpecialCondition(final SelectStatement selectStatement, final SQLIdentifierExpression left) { return false; } protected void parseSpecialCondition(final SelectStatement selectStatement) { } private void parseOtherCondition(final SQLStatement sqlStatement) { getLexer().nextToken(); parseExpression(sqlStatement); } Loading
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/dialect/oracle/OracleParser.java +40 −0 Original line number Diff line number Diff line Loading @@ -20,7 +20,16 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.dialect.oracle; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyword; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleLexer; import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol; import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.OffsetLimit; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.RowCountLimit; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLNumberExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLPlaceholderExpression; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement; import com.google.common.base.Optional; /** Loading @@ -42,4 +51,35 @@ public final class OracleParser extends SQLParser { } return super.parseAlias(); } @Override protected boolean isSpecialCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) { Optional<String> rownumAlias = Optional.absent(); for (SelectItem each : selectStatement.getItems()) { if (each.getAlias().isPresent() && "rownum".equalsIgnoreCase(each.getExpression())) { rownumAlias = each.getAlias(); } } return "rownum".equalsIgnoreCase(expression.getName()) || expression.getName().equalsIgnoreCase(rownumAlias.orNull()); } @Override protected void parseSpecialCondition(final SelectStatement selectStatement) { Symbol symbol = (Symbol) getLexer().getCurrentToken().getType(); getLexer().nextToken(); SQLExpression sqlExpression = parseExpression(selectStatement); if (Symbol.LT == symbol || Symbol.LT_EQ == symbol) { if (sqlExpression instanceof SQLNumberExpression) { selectStatement.getLimit().setRowCountLimit(new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1)); } else if (sqlExpression instanceof SQLPlaceholderExpression) { selectStatement.getLimit().setRowCountLimit(new RowCountLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex())); } } else if (Symbol.GT == symbol || Symbol.GT_EQ == symbol) { if (sqlExpression instanceof SQLNumberExpression) { selectStatement.getLimit().setOffsetLimit(new OffsetLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1)); } else if (sqlExpression instanceof SQLPlaceholderExpression) { selectStatement.getLimit().setOffsetLimit(new OffsetLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex())); } } } }
sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parsing/parser/statement/select/AbstractSelectParser.java +1 −1 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser { } query(); sqlParser.accept(Symbol.RIGHT_PAREN); if (sqlParser.equalAny(Assist.END)) { if (sqlParser.equalAny(DefaultKeyword.WHERE, Assist.END)) { return; } } Loading