提交 3118e420 编写于 作者: T terrymanu

fix page for SQLServer, add order by context to OrderByItems

上级 dd5f7bf4
...@@ -48,6 +48,7 @@ public final class LimitDecoratorResultSetMerger extends AbstractDecoratorResult ...@@ -48,6 +48,7 @@ public final class LimitDecoratorResultSetMerger extends AbstractDecoratorResult
return true; return true;
} }
} }
rowNumber = limit.isRowCountRewriteFlag() ? 0 : limit.getOffsetValue();
return false; return false;
} }
......
...@@ -150,7 +150,7 @@ public class SQLParser extends AbstractParser { ...@@ -150,7 +150,7 @@ public class SQLParser extends AbstractParser {
private void setTableToken(final SQLStatement sqlStatement, final int beginPosition, final SQLPropertyExpression propertyExpr) { private void setTableToken(final SQLStatement sqlStatement, final int beginPosition, final SQLPropertyExpression propertyExpr) {
String owner = propertyExpr.getOwner().getName(); String owner = propertyExpr.getOwner().getName();
if (sqlStatement.getTables().getSingleTableName().equalsIgnoreCase(SQLUtil.getExactlyValue(owner))) { if (!sqlStatement.getTables().isEmpty() && sqlStatement.getTables().getSingleTableName().equalsIgnoreCase(SQLUtil.getExactlyValue(owner))) {
sqlStatement.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner)); sqlStatement.getSqlTokens().add(new TableToken(beginPosition - owner.length(), owner));
} }
} }
......
...@@ -25,6 +25,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.Commo ...@@ -25,6 +25,7 @@ import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.Commo
import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem; import com.dangdang.ddframe.rdb.sharding.parsing.parser.context.selectitem.SelectItem;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException; import com.dangdang.ddframe.rdb.sharding.parsing.parser.exception.SQLParsingUnsupportedException;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.AbstractSelectParser; import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.AbstractSelectParser;
import com.dangdang.ddframe.rdb.sharding.parsing.parser.statement.select.SelectStatement;
import com.google.common.base.Optional; import com.google.common.base.Optional;
public class SQLServerSelectParser extends AbstractSelectParser { public class SQLServerSelectParser extends AbstractSelectParser {
...@@ -67,9 +68,14 @@ public class SQLServerSelectParser extends AbstractSelectParser { ...@@ -67,9 +68,14 @@ public class SQLServerSelectParser extends AbstractSelectParser {
} }
@Override @Override
protected SelectItem parseRowNumberSelectItem() { protected SelectItem parseRowNumberSelectItem(final SelectStatement selectStatement) {
getSqlParser().getLexer().nextToken(); getSqlParser().getLexer().nextToken();
if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) { if (getSqlParser().equalAny(Symbol.LEFT_PAREN)) {
getSqlParser().skipUntil(DefaultKeyword.OVER);
getSqlParser().getLexer().nextToken();
getSqlParser().skipIfEqual(Symbol.LEFT_PAREN);
selectStatement.getOrderByItems().addAll(parseOrderBy());
getSqlParser().skipIfEqual(Symbol.RIGHT_PAREN);
getSqlParser().skipUntil(DefaultKeyword.AS); getSqlParser().skipUntil(DefaultKeyword.AS);
getSqlParser().getLexer().nextToken(); getSqlParser().getLexer().nextToken();
SelectItem result = new CommonSelectItem("ROW_NUMBER", Optional.of(getSqlParser().getLexer().getCurrentToken().getLiterals()), false); SelectItem result = new CommonSelectItem("ROW_NUMBER", Optional.of(getSqlParser().getLexer().getCurrentToken().getLiterals()), false);
......
...@@ -123,7 +123,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -123,7 +123,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
private SelectItem parseSelectItem() { private SelectItem parseSelectItem() {
if (isRowNumberSelectItem()) { if (isRowNumberSelectItem()) {
return parseRowNumberSelectItem(); return parseRowNumberSelectItem(selectStatement);
} }
sqlParser.skipIfEqual(DefaultKeyword.CONNECT_BY_ROOT); sqlParser.skipIfEqual(DefaultKeyword.CONNECT_BY_ROOT);
String literals = sqlParser.getLexer().getCurrentToken().getLiterals(); String literals = sqlParser.getLexer().getCurrentToken().getLiterals();
...@@ -153,7 +153,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser { ...@@ -153,7 +153,7 @@ public abstract class AbstractSelectParser implements SQLStatementParser {
return false; return false;
} }
protected SelectItem parseRowNumberSelectItem() { protected SelectItem parseRowNumberSelectItem(final SelectStatement selectStatement) {
throw new UnsupportedOperationException("Cannot support special select item."); throw new UnsupportedOperationException("Cannot support special select item.");
} }
......
...@@ -73,7 +73,7 @@ public final class ShardingTablesOnlyForPreparedStatementWithSelectTest extends ...@@ -73,7 +73,7 @@ public final class ShardingTablesOnlyForPreparedStatementWithSelectTest extends
@Test @Test
public void assertSelectPagingWithOffsetAndRowCountSql() throws SQLException, DatabaseUnitException { public void assertSelectPagingWithOffsetAndRowCountSql() throws SQLException, DatabaseUnitException {
if (currentDbType() == SQLServer) { if (currentDbType() == SQLServer) {
assertSelectPaging("SelectPagingWithOffsetAndRowCountSql.xml", replacePreparedStatement(getDatabaseTestSQL().getSelectPagingWithOffsetAndRowCountSql()), 2, 10, 19, 1000, 1909, 0); assertSelectPaging("SelectPagingWithOffsetAndRowCountSql.xml", replacePreparedStatement(getDatabaseTestSQL().getSelectPagingWithOffsetAndRowCountSql()), 4, 10, 19, 1000, 1909, 2);
} else { } else {
assertSelectPaging("SelectPagingWithOffsetAndRowCountSql.xml", replacePreparedStatement(getDatabaseTestSQL().getSelectPagingWithOffsetAndRowCountSql()), 10, 19, 1000, 1909, 2, 2); assertSelectPaging("SelectPagingWithOffsetAndRowCountSql.xml", replacePreparedStatement(getDatabaseTestSQL().getSelectPagingWithOffsetAndRowCountSql()), 10, 19, 1000, 1909, 2, 2);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册