Commit 6aabeab6 authored by terrymanu's avatar terrymanu
Browse files

support rownum for oracle 2nd version

parent 5d3649b4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +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.Setter;
import lombok.ToString;

@@ -33,6 +34,7 @@ import static com.dangdang.ddframe.rdb.sharding.util.NumberUtil.roundHalfUp;
 * @author zhangliang
 * @author caohao
 */
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ 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.lexer.token.Symbol;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.limit.Limit;
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;
@@ -68,6 +69,9 @@ public final class OracleParser extends SQLParser {
        Symbol symbol = (Symbol) getLexer().getCurrentToken().getType();
        getLexer().nextToken();
        SQLExpression sqlExpression = parseExpression(selectStatement);
        if (null == selectStatement.getLimit()) {
            selectStatement.setLimit(new Limit());
        }
        if (Symbol.LT == symbol || Symbol.LT_EQ == symbol) {
            if (sqlExpression instanceof SQLNumberExpression) {
                selectStatement.getLimit().setRowCountLimit(new RowCountLimit(((SQLNumberExpression) sqlExpression).getNumber().intValue(), -1));
+11 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.dangdang.ddframe.rdb.sharding.parsing.parser.dialect.oracle;

import com.dangdang.ddframe.rdb.sharding.parsing.lexer.dialect.oracle.OracleKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Assist;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.DefaultKeyword;
import com.dangdang.ddframe.rdb.sharding.parsing.lexer.token.Symbol;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.SQLParser;
@@ -191,11 +192,16 @@ public class OracleSelectParser extends AbstractSelectParser {
    
    @Override
    public final void parseTable() {
        if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) {
            throw new UnsupportedOperationException("Cannot support subquery");
        if (getSqlParser().skipIfEqual(Symbol.LEFT_PAREN)) {
            if (!getSelectStatement().getTables().isEmpty()) {
                throw new UnsupportedOperationException("Cannot support subquery for nested tables.");
            }
            getSelectStatement().setContainStar(false);
            parse();
            getSqlParser().accept(Symbol.RIGHT_PAREN);
            if (getSqlParser().equalAny(DefaultKeyword.WHERE, Assist.END)) {
                return;
            }
        if (getSqlParser().equalAny(DefaultKeyword.SELECT)) {
            throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
        }
        if (getSqlParser().skipIfEqual(OracleKeyword.ONLY)) {
            getSqlParser().skipIfEqual(Symbol.LEFT_PAREN);
+8 −1
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
    @Setter
    private int parametersIndex;
    
    private boolean appendDerivedColumnsFlag;
    
    public AbstractSelectParser(final SQLParser sqlParser) {
        this.sqlParser = sqlParser;
        selectStatement = new SelectStatement();
@@ -273,7 +275,8 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
            if (!selectStatement.getTables().isEmpty()) {
                throw new UnsupportedOperationException("Cannot support subquery for nested tables.");
            }
            query();
            selectStatement.setContainStar(false);
            parse();
            sqlParser.accept(Symbol.RIGHT_PAREN);
            if (sqlParser.equalAny(DefaultKeyword.WHERE, Assist.END)) {
                return;
@@ -326,6 +329,10 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
    }
    
    private void appendDerivedColumns() {
        if (appendDerivedColumnsFlag) {
            return;
        }
        appendDerivedColumnsFlag = true;
        ItemsToken itemsToken = new ItemsToken(selectStatement.getSelectListLastPosition());
        appendAvgDerivedColumns(itemsToken);
        appendDerivedOrderColumns(itemsToken, selectStatement.getOrderByList(), ORDER_BY_DERIVED_ALIAS);
+1 −1
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@
package com.dangdang.ddframe.rdb.integrate;

import com.dangdang.ddframe.rdb.integrate.sql.DatabaseTestSQL;
import com.dangdang.ddframe.rdb.integrate.util.DataBaseEnvironment;
import com.dangdang.ddframe.rdb.integrate.util.DBUnitUtil;
import com.dangdang.ddframe.rdb.integrate.util.DataBaseEnvironment;
import com.dangdang.ddframe.rdb.integrate.util.ShardingJdbcDatabaseTester;
import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType;
import lombok.AccessLevel;