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);
+ }
}
}
}