This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 8a0bc3d2e88 [IOTDB-6275] Disable limit/offset push down in ORDER BY
(#11772)
8a0bc3d2e88 is described below
commit 8a0bc3d2e882a19c4083b3eeb0abc768f7f376ab
Author: YangCaiyin <[email protected]>
AuthorDate: Fri Dec 29 00:03:26 2023 +0800
[IOTDB-6275] Disable limit/offset push down in ORDER BY (#11772)
---
.../apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java | 54 ++++++++++++++++------
.../plan/optimization/LimitOffsetPushDown.java | 8 ++++
2 files changed, 48 insertions(+), 14 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
index 82db0fdf154..6a65ab1ed7e 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
@@ -250,20 +250,6 @@ public class IoTDBOrderByIT {
testNormalOrderBy(sql, Arrays.reverse(ans));
}
- @Test
- public void orderByTest17() {
- String sql = "select num,bigNum,floatNum,str,bool from root.sg.d order by
str desc, str asc";
- int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
- testNormalOrderBy(sql, Arrays.reverse(ans));
- }
-
- @Test
- public void orderByTest18() {
- String sql = "select num,bigNum,floatNum,str,bool from root.sg.d order by
str, str";
- int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
- testNormalOrderBy(sql, ans);
- }
-
@Test
public void orderByTest15() {
String sql = "select num+bigNum,floatNum from root.sg.d order by str";
@@ -397,6 +383,46 @@ public class IoTDBOrderByIT {
}
}
+ @Test
+ public void orderByTest17() {
+ String sql = "select num,bigNum,floatNum,str,bool from root.sg.d order by
str desc, str asc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, Arrays.reverse(ans));
+ }
+
+ @Test
+ public void orderByTest18() {
+ String sql = "select num,bigNum,floatNum,str,bool from root.sg.d order by
str, str";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ // limit cannot be pushed down in ORDER BY
+ @Test
+ public void orderByTest19() {
+ String sql = "select num from root.sg.d order by num limit 5";
+ int[] ans = {2, 1, 0, 7, 8};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "root.sg.d.num"});
+ int i = 0;
+ while (resultSet.next()) {
+ String actualTime = resultSet.getString(1);
+ String actualNum = resultSet.getString(2);
+ assertEquals(res[ans[i]][0], actualTime);
+ assertEquals(res[ans[i]][1], actualNum);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
// 3. aggregation query
@Test
public void orderByInAggregationTest() {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
index 20f7a6d04bf..dbb8d35d8e2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
@@ -33,6 +33,7 @@ import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.LimitNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.MultiChildProcessNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.OffsetNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SortNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.TransformNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.AlignedSeriesScanNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.SeriesScanNode;
@@ -144,6 +145,13 @@ public class LimitOffsetPushDown implements PlanOptimizer {
return node;
}
+ @Override
+ public PlanNode visitSort(SortNode node, RewriterContext context) {
+ // Limit/Offset in ORDER BY focus the sorted result, so it should not be
pushed down.
+ context.setEnablePushDown(false);
+ return node;
+ }
+
@Override
public PlanNode visitTransform(TransformNode node, RewriterContext
context) {
Expression[] outputExpressions = node.getOutputExpressions();