Commit 268307ce authored by terrymanu's avatar terrymanu
Browse files

support rownum for oracle

parent 0f02d5dc
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }
@@ -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);
    }
+40 −0
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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()));
            }
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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;
            }
        }