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

jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 6040fe30dce [to dev/1.3] Fix incorrect early termination in descending 
scan of unpackOneFakeMemChunkMetaData
6040fe30dce is described below

commit 6040fe30dce8750b2c5f2d55b46153c0af765e3b
Author: shuwenwei <[email protected]>
AuthorDate: Thu Mar 12 17:12:49 2026 +0800

    [to dev/1.3] Fix incorrect early termination in descending scan of 
unpackOneFakeMemChunkMetaData
---
 .../org/apache/iotdb/db/it/IoTDBFlushQueryIT.java  | 23 ++++++++
 .../execution/operator/source/SeriesScanUtil.java  | 64 +++++++++++++++-------
 2 files changed, 66 insertions(+), 21 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 ba6f4fc272f..ef6630b85be 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
@@ -245,6 +245,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 bebcfe2537c..cfa03d89c04 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
@@ -682,28 +682,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