提交 47367193 编写于 作者: T terrymanu

for #2441, instead of LimitValueSegment to LimitSegment Limit's constructor

上级 6bca6ae1
......@@ -33,6 +33,7 @@ import org.apache.shardingsphere.core.merge.dql.pagination.RowNumberDecoratorMer
import org.apache.shardingsphere.core.merge.dql.pagination.TopAndRowNumberDecoratorMergedResult;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.parse.sql.context.selectitem.AggregationSelectItem;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.IndexOrderByItemSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -90,14 +91,14 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(LimitDecoratorMergedResult.class));
......@@ -106,7 +107,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(RowNumberDecoratorMergedResult.class));
......@@ -115,7 +116,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildIteratorStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertThat(actual, instanceOf(TopAndRowNumberDecoratorMergedResult.class));
......@@ -131,7 +132,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +142,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +152,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildOrderByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +170,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +181,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +192,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByStreamMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +210,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +220,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +231,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +249,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithMySQLLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +259,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithOracleLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 +269,7 @@ public final class DQLMergeEngineTest {
@Test
public void assertBuildGroupByMemoryMergedResultWithAggregationOnlyWithSQLServerLimit() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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();
......
......@@ -23,6 +23,7 @@ import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.DQLMergeEngine;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -65,12 +66,12 @@ public final class LimitDecoratorMergedResultTest {
}
SelectStatement selectStatement = new SelectStatement();
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, null), Collections.emptyList()));
}
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true), null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 NumberLiteralLimitValueSegment(0, 0, 2, true), null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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,7 @@ public final class LimitDecoratorMergedResultTest {
@Test
public void assertNextWithRowCount() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 2, false), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 2, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.MySQL, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -23,6 +23,7 @@ import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.DQLMergeEngine;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -48,8 +49,6 @@ public final class RowNumberDecoratorMergedResultTest {
private List<QueryResult> queryResults;
private SelectStatement selectStatement;
private SQLRouteResult routeResult;
@Before
......@@ -65,13 +64,12 @@ public final class RowNumberDecoratorMergedResultTest {
for (ResultSet each : resultSets) {
queryResults.add(new TestQueryResult(each));
}
selectStatement = new SelectStatement();
routeResult = new SQLRouteResult(selectStatement);
routeResult = new SQLRouteResult(new SelectStatement());
}
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true), null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true), null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertFalse(actual.next());
......@@ -79,7 +77,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithoutOffsetWithoutRowCount() throws SQLException {
routeResult.setLimit(new Limit(null, null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, null), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
for (int i = 0; i < 8; i++) {
......@@ -90,7 +88,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, false), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......@@ -100,7 +98,7 @@ public final class RowNumberDecoratorMergedResultTest {
@Test
public void assertNextForRowCountBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, true), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, true)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.Oracle, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -23,6 +23,7 @@ import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.merge.MergedResult;
import org.apache.shardingsphere.core.merge.dql.DQLMergeEngine;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -71,7 +72,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextForSkipAll() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE, true), null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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 NumberLiteralLimitValueSegment(0, 0, 5, false), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, null, new NumberLiteralLimitValueSegment(0, 0, 5, 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 NumberLiteralLimitValueSegment(0, 0, 2, true), null, Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, 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,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedFalse() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, 2, false), new NumberLiteralLimitValueSegment(0, 0, 4, false), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2, false), new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......@@ -111,7 +112,7 @@ public final class TopAndRowNumberDecoratorMergedResultTest {
@Test
public void assertNextWithOffsetBoundOpenedTrue() throws SQLException {
routeResult.setLimit(new Limit(new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, false), Collections.emptyList()));
routeResult.setLimit(new Limit(new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(0, 0, 2, true), new NumberLiteralLimitValueSegment(0, 0, 4, false)), Collections.emptyList()));
mergeEngine = new DQLMergeEngine(DatabaseType.SQLServer, routeResult, queryResults);
MergedResult actual = mergeEngine.merge();
assertTrue(actual.next());
......
......@@ -47,7 +47,6 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralE
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.AggregationDistinctSelectItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.ColumnOrderByItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.PredicateSegment;
......@@ -347,12 +346,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimit() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2, true), new NumberLiteralLimitValueSegment(36, 36, 2, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -361,12 +359,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNum() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(119, 119, 2, true), new NumberLiteralLimitValueSegment(98, 98, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -376,12 +373,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumber() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -391,16 +387,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimitForMemoryGroupBy() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2, true), new NumberLiteralLimitValueSegment(36, 36, 2, false));
selectStatement.setLimit(limitSegment);
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
selectStatement.getOrderByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.ASC, OrderDirection.ASC));
selectStatement.getGroupByItems().add(new ColumnOrderByItemSegment(0, 0, columnSegment, OrderDirection.DESC, OrderDirection.ASC));
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -409,16 +404,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumForMemoryGroupBy() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(119, 119, 2, true), new NumberLiteralLimitValueSegment(98, 98, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
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(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -428,16 +422,15 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumberForMemoryGroupBy() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
ColumnSegment columnSegment = new ColumnSegment(0, 0, "id");
columnSegment.setOwner(new TableSegment(0, 0, "x"));
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(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, 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());
......@@ -447,12 +440,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForLimitForNotRewriteLimit() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(33, 33, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(36, 36, 2, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(33, 33, 2, true), new NumberLiteralLimitValueSegment(36, 36, 2, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(17, 23, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -463,12 +455,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForRowNumForNotRewriteLimit() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(119, 119, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(98, 98, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(119, 119, 2, true), new NumberLiteralLimitValueSegment(98, 98, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(68, 74, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......@@ -480,12 +471,11 @@ public final class ShardingSQLRewriterTest {
@Test
public void assertRewriteForTopAndRowNumberForNotRewriteLimit() {
LimitValueSegment offsetSQLSegment = new NumberLiteralLimitValueSegment(123, 123, 2, true);
LimitValueSegment rowCountSQLSegment = new NumberLiteralLimitValueSegment(26, 26, 4, false);
selectStatement.setLimit(new LimitSegment(0, 0, offsetSQLSegment, rowCountSQLSegment));
LimitSegment limitSegment = new LimitSegment(0, 0, new NumberLiteralLimitValueSegment(123, 123, 2, true), new NumberLiteralLimitValueSegment(26, 26, 4, false));
selectStatement.setLimit(limitSegment);
selectStatement.getSqlSegments().add(new TableSegment(85, 91, "table_x"));
routeResult = new SQLRouteResult(selectStatement);
routeResult.setLimit(new Limit(offsetSQLSegment, rowCountSQLSegment, Collections.emptyList()));
routeResult.setLimit(new Limit(limitSegment, Collections.emptyList()));
RoutingResult routingResult = new RoutingResult();
routingResult.getRoutingUnits().add(new RoutingUnit("ds"));
routeResult.setRoutingResult(routingResult);
......
......@@ -18,6 +18,7 @@
package org.apache.shardingsphere.core.route.limit;
import lombok.Getter;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.ParameterMarkerLimitValueSegment;
......@@ -40,9 +41,9 @@ public final class Limit {
private final LimitValue rowCount;
public Limit(final LimitValueSegment offsetSegment, final LimitValueSegment rowCountSegment, final List<Object> parameters) {
offset = null == offsetSegment ? null : createLimitValue(offsetSegment, parameters);
rowCount = null == rowCountSegment ? null : createLimitValue(rowCountSegment, parameters);
public Limit(final LimitSegment limitSegment, final List<Object> parameters) {
offset = limitSegment.getOffset().isPresent() ? createLimitValue(limitSegment.getOffset().get(), parameters) : null;
rowCount = limitSegment.getRowCount().isPresent() ? createLimitValue(limitSegment.getRowCount().get(), parameters) : null;
}
private LimitValue createLimitValue(final LimitValueSegment limitValueSegment, final List<Object> parameters) {
......
......@@ -32,7 +32,6 @@ import org.apache.shardingsphere.core.parse.cache.ParsingResultCache;
import org.apache.shardingsphere.core.parse.entry.ShardingSQLParseEntry;
import org.apache.shardingsphere.core.parse.hook.ParsingHook;
import org.apache.shardingsphere.core.parse.hook.SPIParsingHook;
import org.apache.shardingsphere.core.parse.sql.segment.dml.limit.LimitSegment;
import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
......@@ -105,8 +104,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()) {
final LimitSegment limitSegment = ((SelectStatement) sqlStatement).getLimit();
result.setLimit(new Limit(limitSegment.getOffset().orNull(), limitSegment.getRowCount().orNull(), parameters));
result.setLimit(new Limit(((SelectStatement) sqlStatement).getLimit(), parameters));
}
if (needMerge) {
Preconditions.checkState(1 == routingResult.getRoutingUnits().size(), "Must have one sharding with subquery.");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册