Fix incorrect early termination in descending scan of unpackOneFakeMemChunkMetaData (#17283)
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 b1a5a3d..7e3f7df 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
@@ -243,6 +243,29 @@
}
}
+ @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 5e7111b..fe9cfa9 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 @@
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);
+ }
}
}
}