Commit 2fab4395 authored by terrymanu's avatar terrymanu
Browse files

support rownum for oracle 3nd version

parent 6aabeab6
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingException;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@@ -34,22 +34,26 @@ import static com.dangdang.ddframe.rdb.sharding.util.NumberUtil.roundHalfUp;
 * @author zhangliang
 * @author caohao
 */
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public final class Limit {
    
    private final boolean rowCountRewriteFlag;
    
    private OffsetLimit offsetLimit;
    
    private RowCountLimit rowCountLimit;
    
    public Limit(final RowCountLimit rowCount) {
    public Limit(final boolean rowCountRewriteFlag, final RowCountLimit rowCount) {
        this.rowCountRewriteFlag = rowCountRewriteFlag;
        this.rowCountLimit = rowCount;
    }
    
    public Limit(final OffsetLimit offsetLimit) {
    public Limit(final boolean rowCountRewriteFlag, final OffsetLimit offsetLimit) {
        this.rowCountRewriteFlag = rowCountRewriteFlag;
        this.offsetLimit = offsetLimit;
    }
    
@@ -102,7 +106,12 @@ public final class Limit {
    
    private void rewrite(final List<Object> parameters) {
        int rewriteOffset = 0;
        int rewriteRowCount = null == rowCountLimit ? -1 : getOffset() + rowCountLimit.getRowCount();
        int rewriteRowCount;
        if (rowCountRewriteFlag) {
            rewriteRowCount = null == rowCountLimit ? -1 : getOffset() + rowCountLimit.getRowCount();
        } else {
            rewriteRowCount = rowCountLimit.getRowCount();
        }
        if (null != offsetLimit && offsetLimit.getOffsetParameterIndex() > -1) {
            parameters.set(offsetLimit.getOffsetParameterIndex(), rewriteOffset);
        }
+3 −3
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ public final class MySQLParser extends SQLParser {
        if (!isParameterForValue) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
        }
        return new Limit(new RowCountLimit(value, valueIndex));
        return new Limit(true, new RowCountLimit(value, valueIndex));
    }
    
    private Limit getLimitWithComma(
@@ -104,7 +104,7 @@ public final class MySQLParser extends SQLParser {
        if (!isParameterForRowCount) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(rowCountBeginPosition, rowCount));
        }
        return new Limit(new OffsetLimit(value, valueIndex), new RowCountLimit(rowCount, rowCountIndex));
        return new Limit(true, new OffsetLimit(value, valueIndex), new RowCountLimit(rowCount, rowCountIndex));
    }
    
    private Limit getLimitWithOffset(
@@ -131,6 +131,6 @@ public final class MySQLParser extends SQLParser {
        if (!isParameterForValue) {
            sqlStatement.getSqlTokens().add(new RowCountLimitToken(valueBeginPosition, value));
        }
        return new Limit(new OffsetLimit(offset, offsetIndex), new RowCountLimit(value, valueIndex));
        return new Limit(true, new OffsetLimit(offset, offsetIndex), new RowCountLimit(value, valueIndex));
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ public final class OracleParser extends SQLParser {
        getLexer().nextToken();
        SQLExpression sqlExpression = parseExpression(selectStatement);
        if (null == selectStatement.getLimit()) {
            selectStatement.setLimit(new Limit());
            selectStatement.setLimit(new Limit(false));
        }
        if (Symbol.LT == symbol || Symbol.LT_EQ == symbol) {
            if (sqlExpression instanceof SQLNumberExpression) {
+3 −3
Original line number Diff line number Diff line
@@ -134,11 +134,11 @@ public class PostgreSQLSelectParser extends AbstractSelectParser {
    
    private void setLimit(final Optional<OffsetLimit> offsetLimit, final Optional<RowCountLimit> rowCountLimit) {
        if (offsetLimit.isPresent() && rowCountLimit.isPresent()) {
            getSelectStatement().setLimit(new Limit(offsetLimit.get(), rowCountLimit.get()));
            getSelectStatement().setLimit(new Limit(true, offsetLimit.get(), rowCountLimit.get()));
        } else if (offsetLimit.isPresent()) {
            getSelectStatement().setLimit(new Limit(offsetLimit.get()));
            getSelectStatement().setLimit(new Limit(true, offsetLimit.get()));
        } else if (rowCountLimit.isPresent()) {
            getSelectStatement().setLimit(new Limit(rowCountLimit.get()));
            getSelectStatement().setLimit(new Limit(true, rowCountLimit.get()));
        }
    }
    
+2 −2
Original line number Diff line number Diff line
@@ -109,9 +109,9 @@ public final class SQLServerParser extends SQLParser {
            }
            getLexer().nextToken();
            getLexer().nextToken();
            limit = new Limit(new OffsetLimit(offset, offsetIndex), new RowCountLimit(rowCount, rowCountIndex));
            limit = new Limit(true, new OffsetLimit(offset, offsetIndex), new RowCountLimit(rowCount, rowCountIndex));
        } else {
            limit = new Limit(new OffsetLimit(offset, offsetIndex));
            limit = new Limit(true, new OffsetLimit(offset, offsetIndex));
        }
        selectStatement.setLimit(limit);
    }
Loading