Commit a61ad2d7 authored by terrymanu's avatar terrymanu
Browse files

parse row count for top

parent 86663ceb
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -250,6 +250,7 @@ public class SQLParser extends AbstractParser {
     * @param sqlStatement SQL语句对象
     */
    public final void parseWhere(final SQLStatement sqlStatement) {
        parseAlias();
        if (skipIfEqual(DefaultKeyword.WHERE)) {
            parseConditions(sqlStatement);
        }
@@ -281,7 +282,11 @@ public class SQLParser extends AbstractParser {
            return;
        }
        if (equalAny(Symbol.LT, Symbol.GT, Symbol.LT_EQ, Symbol.GT_EQ)) {
            if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement && isRowNumberCondition((SelectStatement) sqlStatement, (SQLIdentifierExpression) left)) {
            if (left instanceof SQLIdentifierExpression && sqlStatement instanceof SelectStatement
                    && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLIdentifierExpression) left).getName())) {
                parseRowNumberCondition((SelectStatement) sqlStatement);
            } else if (left instanceof SQLPropertyExpression && sqlStatement instanceof SelectStatement
                    && isRowNumberCondition((SelectStatement) sqlStatement, ((SQLPropertyExpression) left).getName())) {
                parseRowNumberCondition((SelectStatement) sqlStatement);
            } else {
                parseOtherCondition(sqlStatement);
@@ -332,7 +337,7 @@ public class SQLParser extends AbstractParser {
        }
    }
    
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression left) {
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) {
        return false;
    }
    
+2 −3
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyw
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleLexer;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement;
import com.google.common.base.Optional;

@@ -47,13 +46,13 @@ public final class OracleParser extends SQLParser {
    }
    
    @Override
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) {
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) {
        Optional<String> rowNumberAlias = Optional.absent();
        for (SelectItem each : selectStatement.getItems()) {
            if (each.getAlias().isPresent() && "rownum".equalsIgnoreCase(each.getExpression())) {
                rowNumberAlias = each.getAlias();
            }
        }
        return "rownum".equalsIgnoreCase(expression.getName()) || expression.getName().equalsIgnoreCase(rowNumberAlias.orNull());
        return "rownum".equalsIgnoreCase(columnLabel) || columnLabel.equalsIgnoreCase(rowNumberAlias.orNull());
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ public final class SQLServerDeleteParser extends AbstractDeleteParser {
    
    @Override
    protected void skipBetweenDeleteAndTable() {
        ((SQLServerParser) getSqlParser()).skipTop();
        ((SQLServerParser) getSqlParser()).parseTop(getDeleteStatement());
        ((SQLServerParser) getSqlParser()).skipOutput();
        getSqlParser().skipIfEqual(DefaultKeyword.FROM);
    }
+23 −5
Original line number Diff line number Diff line
@@ -30,7 +30,10 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.RowCountLi
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIdentifierExpression;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLExpression;
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.SQLStatement;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement;
import com.google.common.base.Optional;

@@ -47,19 +50,34 @@ public final class SQLServerParser extends SQLParser {
    }
    
    @Override
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final SQLIdentifierExpression expression) {
    protected boolean isRowNumberCondition(final SelectStatement selectStatement, final String columnLabel) {
        Optional<String> rowNumberAlias = Optional.absent();
        for (SelectItem each : selectStatement.getItems()) {
            if (each.getAlias().isPresent() && "ROW_NUMBER".equalsIgnoreCase(each.getExpression())) {
                rowNumberAlias = each.getAlias();
            }
        }
        return expression.getName().equalsIgnoreCase(rowNumberAlias.orNull());
        return columnLabel.equalsIgnoreCase(rowNumberAlias.orNull());
    }
    
    public void skipTop() {
    public void parseTop(final SQLStatement sqlStatement) {
        if (skipIfEqual(SQLServerKeyword.TOP)) {
            parseExpression();
            skipIfEqual(Symbol.LEFT_PAREN);
            SQLExpression sqlExpression = parseExpression();
            skipIfEqual(Symbol.RIGHT_PAREN);
            RowCountLimit rowCountLimit;
            if (sqlExpression instanceof SQLNumberExpression) {
                rowCountLimit = new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1);
            } else if (sqlExpression instanceof SQLPlaceholderExpression) {
                rowCountLimit = new RowCountLimit(-1, ((SQLPlaceholderExpression) sqlExpression).getIndex());
            } else {
                throw new SQLParsingException(getLexer());
            }
            if (null == sqlStatement.getLimit()) {
                sqlStatement.setLimit(new Limit(false, rowCountLimit));
            } else {
                sqlStatement.getLimit().setRowCountLimit(rowCountLimit);
            }
            skipIfEqual(SQLServerKeyword.PERCENT);
        }
    }
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
        if (getSqlParser().skipIfEqual(DefaultKeyword.SELECT)) {
            parseDistinct();
            if (getSqlParser().equalAny(SQLServerKeyword.TOP)) {
                ((SQLServerParser) getSqlParser()).skipTop();
                ((SQLServerParser) getSqlParser()).parseTop(getSelectStatement());
            }
            parseSelectList();
        }
@@ -68,6 +68,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
    
    @Override
    protected SelectItem parseRowNumberSelectItem() {
        getSqlParser().getLexer().nextToken();
        if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) {
            getSqlParser().skipUntil(DefaultKeyword.AS);
            getSqlParser().getLexer().nextToken();
Loading