提交 6aab8e47 编写于 作者: T terrymanu

for #2441, private limit.fillParameters()

上级 d5176d1a
......@@ -90,14 +90,14 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, singleQueryResult);
assertThat(mergeEngine.merge(), instanceOf(IteratorStreamMergedResult.class));
}
@Test
public void assertBuildIteratorStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(LimitDecoratorMergedResult.class));
......@@ -106,7 +106,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(RowNumberDecoratorMergedResult.class));
......@@ -115,7 +115,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(TopAndRowNumberDecoratorMergedResult.class));
......@@ -131,7 +131,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -141,7 +141,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -151,7 +151,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -169,7 +169,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
......@@ -180,7 +180,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
......@@ -191,7 +191,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
......@@ -209,7 +209,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -219,7 +219,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getOrderByItems().add(new IndexOrderByItemSegment(0, 0, 2, OrderDirection.DESC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
......@@ -230,7 +230,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.ASC, OrderDirection.ASC));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
......@@ -248,7 +248,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -258,7 +258,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......@@ -268,7 +268,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
selectStatement.getItems().add(new AggregationSelectItem(AggregationType.COUNT, "(*)", Optional.<String>absent()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
......
......@@ -35,6 +35,7 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertFalse;
......@@ -65,12 +66,12 @@ public final class LimitDecoratorMergedResultTest {
}
SelectStatement selectStatement = new SelectStatement();
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
}
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true)), null));
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true)), null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -78,7 +79,7 @@ public final class LimitDecoratorMergedResultTest {
@Test
public void assertNextWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null));
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 6; i++) {
......@@ -89,7 +90,8 @@ public final class LimitDecoratorMergedResultTest {
@Test
public void assertNextWithRowCount() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false))));
routeResult.setLimit(new Limit(
new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -35,6 +35,7 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertFalse;
......@@ -71,7 +72,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null));
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -79,7 +80,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithoutOffsetWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(null, null));
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 8; i++) {
......@@ -90,7 +91,8 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false))));
routeResult.setLimit(new Limit(
new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......@@ -100,7 +102,8 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, true))));
routeResult.setLimit(new Limit(
new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, true)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -35,6 +35,7 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertFalse;
......@@ -71,7 +72,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true)), null));
routeResult.setLimit(new Limit(new LimitValue(Integer.MAX_VALUE, -1, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true)), null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -79,7 +80,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithoutOffsetWithRowCount() throws SQLException {
routeResult.setLimit(new Limit(null, new LimitValue(5, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false))));
routeResult.setLimit(new Limit(null, new LimitValue(5, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 5; i++) {
......@@ -90,7 +91,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null));
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), null, Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 7; i++) {
......@@ -101,7 +102,8 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false))));
routeResult.setLimit(new Limit(
new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, false)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......@@ -111,7 +113,8 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false))));
routeResult.setLimit(new Limit(
new LimitValue(2, -1, new NumberLiteralLimitValueSegment(0, 0, 2, true)), new LimitValue(4, -1, new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -344,7 +344,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(2, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(2, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.MySQL, Collections.emptyList());
......@@ -358,7 +358,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(68, 74, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.Oracle, Collections.emptyList());
......@@ -373,7 +373,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(85, 91, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.SQLServer, Collections.emptyList());
......@@ -392,7 +392,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT x.id FROM table_x x LIMIT 2, 2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.MySQL, Collections.emptyList());
......@@ -410,7 +410,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_x x) row_ WHERE rownum<=4) t WHERE t.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.Oracle, Collections.emptyList());
......@@ -429,7 +429,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
routeResult.setRoutingResult(new RoutingResult());
selectStatement.setLogicSQL("SELECT * FROM (SELECT TOP(4) row_number() OVER (ORDER BY x.id) AS rownum_, x.id FROM table_x x) AS row_ WHERE row_.rownum_>2");
SQLRewriteEngine rewriteEngine = createSQLRewriteEngine(DatabaseType.SQLServer, Collections.emptyList());
......@@ -444,7 +444,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(17, 23, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -460,7 +460,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(68, 74, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -477,7 +477,7 @@ public final class ShardingSQLRewriterTest {
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
selectStatement.addSQLToken(new TableToken(85, 91, "table_x", QuoteCharacter.NONE));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment)));
routeResult.setLimit(new Limit(new LimitValue(2, -1, offsetSQLSegment), new LimitValue(4, -1, rowCountSQLSegment), Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......
......@@ -41,9 +41,26 @@ public final class Limit {
private LimitValue rowCount;
public Limit(final LimitValue offset, final LimitValue rowCount) {
public Limit(final LimitValue offset, final LimitValue rowCount, final List<Object> parameters) {
this.offset = offset;
this.rowCount = rowCount;
fillParameters(parameters);
}
private void fillParameters(final List<Object> parameters) {
int offset = 0;
if (null != this.offset) {
offset = -1 == this.offset.getIndex() ? getOffsetValue() : NumberUtil.roundHalfUp(parameters.get(this.offset.getIndex()));
this.offset.setValue(offset);
}
int rowCount = 0;
if (null != this.rowCount) {
rowCount = -1 == this.rowCount.getIndex() ? getRowCountValue() : NumberUtil.roundHalfUp(parameters.get(this.rowCount.getIndex()));
this.rowCount.setValue(rowCount);
}
if (offset < 0 || rowCount < 0) {
throw new SQLParsingException("LIMIT offset and row count can not be a negative value.");
}
}
/**
......@@ -64,27 +81,6 @@ public final class Limit {
return null != rowCount ? rowCount.getValue() : -1;
}
/**
* Fill parameters.
*
* @param parameters SQL parameters
*/
public void fillParameters(final List<Object> parameters) {
int offset = 0;
if (null != this.offset) {
offset = -1 == this.offset.getIndex() ? getOffsetValue() : NumberUtil.roundHalfUp(parameters.get(this.offset.getIndex()));
this.offset.setValue(offset);
}
int rowCount = 0;
if (null != this.rowCount) {
rowCount = -1 == this.rowCount.getIndex() ? getRowCountValue() : NumberUtil.roundHalfUp(parameters.get(this.rowCount.getIndex()));
this.rowCount.setValue(rowCount);
}
if (offset < 0 || rowCount < 0) {
throw new SQLParsingException("LIMIT offset and row count can not be a negative value.");
}
}
/**
* Revise parameters.
*
......
......@@ -109,7 +109,7 @@ public final class ParsingSQLRouter implements ShardingRouter {
}
RoutingResult routingResult = RoutingEngineFactory.newInstance(shardingRule, shardingMetaData.getDataSource(), sqlStatement, optimizeResult).route();
if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getLimit() && !routingResult.isSingleRouting()) {
result.setLimit(createLimit((SelectStatement) sqlStatement, parameters));
result.setLimit(createLimit(((SelectStatement) sqlStatement).getLimit(), parameters));
}
if (needMerge) {
Preconditions.checkState(1 == routingResult.getRoutingUnits().size(), "Must have one sharding with subquery.");
......@@ -189,13 +189,7 @@ public final class ParsingSQLRouter implements ShardingRouter {
}
}
private Limit createLimit(final SelectStatement selectStatement, final List<Object> parameters) {
Limit result = createLimit(selectStatement.getLimit());
result.fillParameters(parameters);
return result;
}
private Limit createLimit(final LimitSegment limitSegment) {
private Limit createLimit(final LimitSegment limitSegment, final List<Object> parameters) {
LimitValue offset = null;
if (limitSegment.getOffset().isPresent()) {
offset = createLimitValue(limitSegment.getOffset().get());
......@@ -204,7 +198,7 @@ public final class ParsingSQLRouter implements ShardingRouter {
if (limitSegment.getRowCount().isPresent()) {
rowCount = createLimitValue(limitSegment.getRowCount().get());
}
return new Limit(offset, rowCount);
return new Limit(offset, rowCount, parameters);
}
private LimitValue createLimitValue(final LimitValueSegment limitValueSegment) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册