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