This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 1cd4bc3c1bf NonAlignedTreeDeviceViewScan may return limit + offset
lines result when the offset is pushed down
1cd4bc3c1bf is described below
commit 1cd4bc3c1bf746c14c44eeb6e00ae4217fec0c37
Author: shuwenwei <[email protected]>
AuthorDate: Wed May 21 14:00:17 2025 +0800
NonAlignedTreeDeviceViewScan may return limit + offset lines result when
the offset is pushed down
---
.../plan/planner/TableOperatorGenerator.java | 13 +++++++-----
...nAlignedTreeDeviceViewScanOperatorTreeTest.java | 23 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index 30087ebfbdc..d067f7cb84b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -547,13 +547,13 @@ public class TableOperatorGenerator extends
PlanVisitor<Operator, LocalExecution
boolean canPushDownLimitToAllSeriesScanOptions =
canPushDownLimit &&
pushDownConjunctsForEachMeasurement.isEmpty();
// the left child of LeftOuterTimeJoinOperator is
SeriesScanOperator
- boolean pushDownLimitToLeftChildSeriesScanOperator =
+ boolean pushDownOffsetAndLimitToLeftChildSeriesScanOperator =
canPushDownLimit && pushDownConjunctsForEachMeasurement.size()
== 1;
// the left child of LeftOuterTimeJoinOperator is
InnerTimeJoinOperator
boolean pushDownOffsetAndLimitAfterInnerJoinOperator =
canPushDownLimit && pushDownConjunctsForEachMeasurement.size()
> 1;
removeUpperOffsetAndLimitOperator =
- pushDownLimitToLeftChildSeriesScanOperator
+ pushDownOffsetAndLimitToLeftChildSeriesScanOperator
|| pushDownOffsetAndLimitAfterInnerJoinOperator
|| isSingleColumn;
for (int i = 0; i < measurementSchemas.size(); i++) {
@@ -580,16 +580,19 @@ public class TableOperatorGenerator extends
PlanVisitor<Operator, LocalExecution
commonParameter.timeColumnName));
}
if (isSingleColumn
- || (pushDownLimitToLeftChildSeriesScanOperator
+ || (pushDownOffsetAndLimitToLeftChildSeriesScanOperator
&& pushDownPredicateForCurrentMeasurement != null)) {
builder.withPushDownLimit(node.getPushDownLimit());
builder.withPushLimitToEachDevice(node.isPushLimitToEachDevice());
}
- if (canPushDownLimitToAllSeriesScanOptions) {
+
+ // In the case of single column, both offset and limit are
pushed down to the
+ // SeriesScanOperator
+ if (!isSingleColumn && canPushDownLimitToAllSeriesScanOptions) {
builder.withPushDownLimit(node.getPushDownLimit() +
node.getPushDownOffset());
}
if (isSingleColumn
- || (pushDownLimitToLeftChildSeriesScanOperator
+ || (pushDownOffsetAndLimitToLeftChildSeriesScanOperator
&& pushDownPredicateForCurrentMeasurement != null)) {
builder.withPushDownOffset(
node.isPushLimitToEachDevice() ? 0 :
node.getPushDownOffset());
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/NonAlignedTreeDeviceViewScanOperatorTreeTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/NonAlignedTreeDeviceViewScanOperatorTreeTest.java
index 44f94df94f0..e5cfb1c2b2f 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/NonAlignedTreeDeviceViewScanOperatorTreeTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/NonAlignedTreeDeviceViewScanOperatorTreeTest.java
@@ -273,6 +273,29 @@ public class NonAlignedTreeDeviceViewScanOperatorTreeTest {
}
}
+ @Test
+ public void testScanSingleFieldColumnWithPushLimitToEachDevice1() throws
Exception {
+ List<String> outputColumnList = Arrays.asList("sensor0");
+ TreeNonAlignedDeviceViewScanNode node =
+ getTreeNonAlignedDeviceViewScanNode(outputColumnList,
Arrays.asList("sensor0"));
+ node.setPushLimitToEachDevice(false);
+ node.setPushDownLimit(1);
+ node.setPushDownOffset(1);
+ ExecutorService instanceNotificationExecutor =
+ IoTDBThreadPoolFactory.newFixedThreadPool(1,
"test-instance-notification");
+ Operator operator = getOperator(node, instanceNotificationExecutor);
+ assertTrue(operator instanceof DeviceIteratorScanOperator);
+ try {
+ checkResult(operator, outputColumnList, 1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ operator.close();
+ instanceNotificationExecutor.shutdown();
+ }
+ }
+
@Test
public void testScanWithPushDownPredicateAndPushLimitToEachDevice1() throws
Exception {
List<String> outputColumnList = Arrays.asList("sensor0", "sensor1",
"sensor2", "time", "tag1");