This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch fix_template_offset_limit_align_by_device
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 08616f40f61355106c9339355d981ba6d5262601
Author: Beyyes <[email protected]>
AuthorDate: Thu Dec 19 16:55:28 2024 +0800

    fix error in template + sort + offset + limit + align by device
---
 .../IoTDBAlignByDeviceWithTemplateIT.java          | 28 ++++++++++++++++++++--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 11 +++++----
 .../plan/analyze/TemplatedAggregationAnalyze.java  |  6 ++---
 .../queryengine/plan/analyze/TemplatedAnalyze.java |  7 +++---
 4 files changed, 38 insertions(+), 14 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
index 05e2104b904..a71cb773713 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
@@ -59,6 +59,9 @@ public class IoTDBAlignByDeviceWithTemplateIT {
         "INSERT INTO root.sg2.d4(timestamp,s1,s2,s3) 
values(1,1111.1,true,1111), (5,5555.5,false,5555);",
       };
 
+  String[] expectedHeader;
+  String[] retArray;
+
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().initClusterEnvironment();
@@ -70,11 +73,32 @@ public class IoTDBAlignByDeviceWithTemplateIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
+  @Test
+  public void singleDeviceTest() {
+    expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
+    retArray =
+        new String[] {
+          "1,root.sg1.d1,1,1.1,false,",
+        };
+    resultSetEqualTest(
+        "SELECT * FROM root.sg1.d1 order by time desc offset 1 limit 1 ALIGN 
BY DEVICE;",
+        expectedHeader,
+        retArray);
+    retArray =
+        new String[] {
+          "1,root.sg2.d1,1,1.1,false,",
+        };
+    resultSetEqualTest(
+        "SELECT * FROM root.sg2.d1 order by time desc offset 1 limit 1 ALIGN 
BY DEVICE;",
+        expectedHeader,
+        retArray);
+  }
+
   @Test
   public void selectWildcardNoFilterTest() {
     // 1. order by device
-    String[] expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
-    String[] retArray =
+    expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
+    retArray =
         new String[] {
           "1,root.sg1.d1,1,1.1,false,",
           "2,root.sg1.d1,2,2.2,false,",
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 224d22520a0..ed441e9dc00 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -319,13 +319,16 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
       List<Pair<Expression, String>> outputExpressions;
       if (queryStatement.isAlignByDevice()) {
-        if (TemplatedAnalyze.canBuildPlanUseTemplate(
-            analysis, queryStatement, partitionFetcher, schemaTree, context)) {
+        List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
+
+        if (deviceList.size() > 1
+            && TemplatedAnalyze.canBuildPlanUseTemplate(
+                analysis, queryStatement, partitionFetcher, schemaTree, 
context, deviceList)) {
+          // when device size is less than 1, there is no need to use template 
optimization, i.e. no
+          // need to extract common variables
           return analysis;
         }
 
-        List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
         if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
           // remove the device which won't appear in resultSet after 
limit/offset
           deviceList =
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
index 495d144a80d..dc7df32007f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
@@ -54,7 +54,6 @@ import static 
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.se
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDataPartition;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceToWhere;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceViewOutput;
-import static 
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeFrom;
 import static 
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
 import static 
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
 import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME;
@@ -68,7 +67,8 @@ public class TemplatedAggregationAnalyze {
       IPartitionFetcher partitionFetcher,
       ISchemaTree schemaTree,
       MPPQueryContext context,
-      Template template) {
+      Template template,
+      List<PartialPath> deviceList) {
 
     // not support order by expression and non-aligned template
     if (queryStatement.hasOrderByExpression() || !template.isDirectAligned()) {
@@ -77,8 +77,6 @@ public class TemplatedAggregationAnalyze {
 
     analysis.setNoWhereAndAggregation(false);
 
-    List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
     if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
       // remove the device which won't appear in resultSet after limit/offset
       deviceList =
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
index c1f0971b293..ea70fcb0e3a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
@@ -97,7 +97,8 @@ public class TemplatedAnalyze {
       QueryStatement queryStatement,
       IPartitionFetcher partitionFetcher,
       ISchemaTree schemaTree,
-      MPPQueryContext context) {
+      MPPQueryContext context,
+      List<PartialPath> deviceList) {
     if (queryStatement.getGroupByComponent() != null
         || queryStatement.isSelectInto()
         || queryStatement.hasFill()
@@ -114,7 +115,7 @@ public class TemplatedAnalyze {
 
     if (queryStatement.isAggregationQuery()) {
       return canBuildAggregationPlanUseTemplate(
-          analysis, queryStatement, partitionFetcher, schemaTree, context, 
template);
+          analysis, queryStatement, partitionFetcher, schemaTree, context, 
template, deviceList);
     }
 
     List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
@@ -174,8 +175,6 @@ public class TemplatedAnalyze {
 
     analyzeSelect(queryStatement, analysis, outputExpressions, template);
 
-    List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
     analyzeDeviceToWhere(analysis, queryStatement);
     if (analysis.getWhereExpression() != null
         && analysis.getWhereExpression().equals(ConstantOperand.FALSE)) {

Reply via email to