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();

Reply via email to