You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2023/05/14 12:41:46 UTC

[iotdb] 01/01: [IOTDB-5837] Fix exception in select-into of ALIGN BY DEVICE query

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

hui pushed a commit to branch lmh/fixSelectInto1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit c1114b6d8088c71dd81405440f028c9389bb3cbd
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Mon May 8 11:42:08 2023 +0800

    [IOTDB-5837] Fix exception in select-into of ALIGN BY DEVICE query
    
    (cherry picked from commit 6118e6cec6b6b1e6e48f07860cb4dbc824ae7a67)
---
 .../iotdb/db/it/selectinto/IoTDBSelectIntoIT.java  | 30 ++++++++++++++++++++++
 .../operator/process/DeviceViewIntoOperator.java   |  6 ++++-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
index 3712ce3b9bf..c9d865128f7 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java
@@ -483,6 +483,36 @@ public class IoTDBSelectIntoIT {
         "select k1, k2, k3 from root.sg_abd_expr.*;", expectedQueryHeader, queryRetArray);
   }
 
+  @Test
+  public void testExpressionAlignByDevice2() {
+    String[] intoRetArray =
+        new String[] {
+          "root.sg.d1,avg(s1),root.agg_expr.d1.avg_s1,1,",
+          "root.sg.d1,sum(s1) + sum(s1),root.agg_expr.d1.sum_s1_add_s1,1,",
+          "root.sg.d1,count(s2),root.agg_expr.d1.count_s2,1,",
+          "root.sg.d2,avg(s1),root.agg_expr.d2.avg_s1,1,",
+          "root.sg.d2,sum(s1) + sum(s1),root.agg_expr.d2.sum_s1_add_s1,1,",
+          "root.sg.d2,count(s2),root.agg_expr.d2.count_s2,1,",
+        };
+    resultSetEqualTest(
+        "select avg(s1), sum(s1) + sum(s1), count(s2)"
+            + " into root.agg_expr.${2}(avg_s1, sum_s1_add_s1, count_s2)"
+            + " from root.sg.d1, root.sg.d2 align by device;",
+        selectIntoAlignByDeviceHeader, intoRetArray);
+
+    String expectedQueryHeader =
+        "Time,root.agg_expr.d1.avg_s1,root.agg_expr.d2.avg_s1,root.agg_expr.d1.sum_s1_add_s1,"
+            + "root.agg_expr.d2.sum_s1_add_s1,root.agg_expr.d1.count_s2,root.agg_expr.d2.count_s2,";
+    String[] queryRetArray =
+        new String[] {
+          "0,6.5,6.428571428571429,130.0,90.0,9,8,",
+        };
+    resultSetEqualTest(
+        "select avg_s1, sum_s1_add_s1, count_s2 from root.agg_expr.*;",
+        expectedQueryHeader,
+        queryRetArray);
+  }
+
   // -------------------------------------- CHECK EXCEPTION -------------------------------------
 
   @Test
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/DeviceViewIntoOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/DeviceViewIntoOperator.java
index 5f2d2022192..32a0959d80f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/DeviceViewIntoOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/DeviceViewIntoOperator.java
@@ -49,6 +49,7 @@ public class DeviceViewIntoOperator extends AbstractIntoOperator {
   private final Map<String, Boolean> targetDeviceToAlignedMap;
   private final Map<String, List<Pair<String, PartialPath>>> deviceToSourceTargetPathPairListMap;
 
+  private final int deviceColumnIndex;
   private String currentDevice;
 
   private final TsBlockBuilder resultTsBlockBuilder;
@@ -82,6 +83,9 @@ public class DeviceViewIntoOperator extends AbstractIntoOperator {
             .map(ColumnHeader::getColumnType)
             .collect(Collectors.toList());
     this.resultTsBlockBuilder = new TsBlockBuilder(outputDataTypes);
+
+    this.deviceColumnIndex =
+        sourceColumnToInputLocationMap.get(ColumnHeaderConstant.DEVICE).getValueColumnIndex();
   }
 
   @Override
@@ -90,7 +94,7 @@ public class DeviceViewIntoOperator extends AbstractIntoOperator {
       return true;
     }
 
-    String device = String.valueOf(inputTsBlock.getValueColumns()[0].getBinary(0));
+    String device = String.valueOf(inputTsBlock.getValueColumns()[deviceColumnIndex].getBinary(0));
     if (!Objects.equals(device, currentDevice)) {
       InsertMultiTabletsStatement insertMultiTabletsStatement =
           constructInsertMultiTabletsStatement(false);