This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch fixDescSerisScanBug0311-dev1.3 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d9d35a17d45b5d916215fde0a5d849e0c818acf3 Author: shuwenwei <[email protected]> AuthorDate: Wed Mar 11 18:49:51 2026 +0800 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); + } } } }
