This is an automated email from the ASF dual-hosted git repository.

shuwenwei pushed a commit to branch fixDescSerisScanBug0311
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 914ac7da03e5feb79cfae4343a23e82ee8a81fbe
Author: shuwenwei <[email protected]>
AuthorDate: Wed Mar 11 18:45:07 2026 +0800

    Fix incorrect early termination in descending scan of 
unpackOneFakeMemChunkMetaData
---
 .../org/apache/iotdb/db/it/IoTDBFlushQueryIT.java  | 24 +++++++-
 .../execution/operator/source/SeriesScanUtil.java  | 64 +++++++++++++++-------
 2 files changed, 66 insertions(+), 22 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFlushQueryIT.java 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFlushQueryIT.java
index b1a5a3d1562..9bc42c134fd 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFlushQueryIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFlushQueryIT.java
@@ -77,7 +77,6 @@ public class IoTDBFlushQueryIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
   }
 
   @AfterClass
@@ -243,6 +242,29 @@ public class IoTDBFlushQueryIT {
     }
   }
 
+  @Test
+  public void testStreamingQueryMemTableDescWithTimeFilter()
+      throws IoTDBConnectionException, StatementExecutionException {
+    String device = "root.stream3.d1";
+    try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      session.open();
+      generateTimeRangeWithTimestamp(session, device, 1, 2);
+      session.executeNonQueryStatement("flush");
+      generateTimeRangeWithTimestamp(session, device, 100000, 200000);
+      generateTimeRangeWithTimestamp(session, device, 400000, 500000);
+
+      SessionDataSet sessionDataSet =
+          session.executeQueryStatement(
+              "select s1 from root.stream3.d1 where time >= 350000 order by 
time desc limit 1");
+      SessionDataSet.DataIterator iterator = sessionDataSet.iterator();
+      long value = 0;
+      while (iterator.next()) {
+        value = iterator.getLong(1);
+      }
+      Assert.assertEquals(500000L, value);
+    }
+  }
+
   private static void generateTimeRangeWithTimestamp(
       ISession session, String device, long start, long end)
       throws IoTDBConnectionException, StatementExecutionException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
index 5e7111bf09c..fe9cfa9c0f8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
@@ -724,28 +724,50 @@ public class SeriesScanUtil implements Accountable {
     MemPointIterator memPointIterator =
         readOnlyMemChunk.createMemPointIterator(
             orderUtils.getScanOrder(), scanOptions.getGlobalTimeFilter());
-    for (Statistics<? extends Serializable> statistics : statisticsList) {
-      long orderTime = orderUtils.getOrderTime(statistics);
-      boolean canSkip =
-          (orderUtils.getAscending() && orderTime > 
satisfiedTimeRange.getMax())
-              || (!orderUtils.getAscending() && orderTime < 
satisfiedTimeRange.getMin());
-      if (canSkip) {
-        break;
+    if (orderUtils.getAscending()) {
+      for (Statistics<? extends Serializable> statistics : statisticsList) {
+        long orderTime = orderUtils.getOrderTime(statistics);
+        if (orderTime > satisfiedTimeRange.getMax()) {
+          break;
+        }
+        IVersionPageReader versionPageReader =
+            new LazyMemVersionPageReader(
+                context,
+                timestampInFileName,
+                chunkMetaData.getVersion(),
+                chunkMetaData.getOffsetOfChunkHeader(),
+                isAligned,
+                statistics,
+                memPointIterator,
+                chunkMetaData.isSeq());
+        if (chunkMetaData.isSeq()) {
+          seqPageReaders.add(versionPageReader);
+        } else {
+          unSeqPageReaders.add(versionPageReader);
+        }
       }
-      IVersionPageReader versionPageReader =
-          new LazyMemVersionPageReader(
-              context,
-              timestampInFileName,
-              chunkMetaData.getVersion(),
-              chunkMetaData.getOffsetOfChunkHeader(),
-              isAligned,
-              statistics,
-              memPointIterator,
-              chunkMetaData.isSeq());
-      if (chunkMetaData.isSeq()) {
-        seqPageReaders.add(versionPageReader);
-      } else {
-        unSeqPageReaders.add(versionPageReader);
+    } else {
+      for (int i = statisticsList.size() - 1; i >= 0; i--) {
+        Statistics<? extends Serializable> statistics = statisticsList.get(i);
+        long orderTime = orderUtils.getOrderTime(statistics);
+        if (orderTime < satisfiedTimeRange.getMin()) {
+          break;
+        }
+        IVersionPageReader versionPageReader =
+            new LazyMemVersionPageReader(
+                context,
+                timestampInFileName,
+                chunkMetaData.getVersion(),
+                chunkMetaData.getOffsetOfChunkHeader(),
+                isAligned,
+                statistics,
+                memPointIterator,
+                chunkMetaData.isSeq());
+        if (chunkMetaData.isSeq()) {
+          seqPageReaders.add(versionPageReader);
+        } else {
+          unSeqPageReaders.add(versionPageReader);
+        }
       }
     }
   }

Reply via email to