You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/31 00:58:12 UTC

[iotdb] branch master updated: fix between bug in select

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 7de6b21798 fix between bug in select
7de6b21798 is described below

commit 7de6b21798147551d3452bf79be5828826d0d8cf
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Wed Aug 31 08:58:05 2022 +0800

    fix between bug in select
---
 .../apache/iotdb/db/it/IoTDBFilterBetweenIT.java   | 32 ++++++++++++++++++++++
 .../db/mpp/plan/analyze/ExpressionAnalyzer.java    | 29 +++++++++++++-------
 2 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFilterBetweenIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFilterBetweenIT.java
index 48e9fac9f9..7f667ce287 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFilterBetweenIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBFilterBetweenIT.java
@@ -35,6 +35,8 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
+import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
+import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR;
 import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
@@ -171,6 +173,36 @@ public class IoTDBFilterBetweenIT {
           Assert.assertEquals(String.valueOf(i), rs.getString("root.vehicle.d1.s3"));
         }
       }
+
+      String[] expectedHeader =
+          new String[] {
+            TIMESTAMP_STR, "root.vehicle.d1.s1 BETWEEN 1 AND 2", "Time BETWEEN 0 AND 1"
+          };
+      String[] retArray = new String[] {"1,true,true,", "2,true,false,", "3,false,false,"};
+      resultSetEqualTest(
+          "select s1 between 1 and 2, time between 0 and 1 from root.vehicle.d1 where time between 1 and 3",
+          expectedHeader,
+          retArray);
+
+      expectedHeader = new String[] {TIMESTAMP_STR, "r1", "r2"};
+      retArray = new String[] {"1,true,true,", "2,true,false,", "3,false,false,"};
+      resultSetEqualTest(
+          "select s1 between 1 and 2 as r1, time between 0 and 1 as r2 from root.vehicle.d1 where time between 1 and 3",
+          expectedHeader,
+          retArray);
+
+      expectedHeader =
+          new String[] {TIMESTAMP_STR, "Device", "s1 BETWEEN 1 AND 2", "Time BETWEEN 0 AND 1"};
+      retArray =
+          new String[] {
+            "1,root.vehicle.d1,true,true,",
+            "2,root.vehicle.d1,true,false,",
+            "3,root.vehicle.d1,false,false,"
+          };
+      resultSetEqualTest(
+          "select s1 between 1 and 2, time between 0 and 1 from root.vehicle.* where time between 1 and 3 align by device",
+          expectedHeader,
+          retArray);
     } catch (SQLException e) {
       e.printStackTrace();
       Assert.fail(e.getMessage());
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
index 84fa0e4f3e..7fbedad95c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
@@ -124,20 +124,29 @@ public class ExpressionAnalyzer {
       boolean rawFlag = false, aggregationFlag = false;
       if (firstType == ResultColumn.ColumnType.RAW
           || secondType == ResultColumn.ColumnType.RAW
-          || thirdType == ResultColumn.ColumnType.RAW) rawFlag = true;
+          || thirdType == ResultColumn.ColumnType.RAW) {
+        rawFlag = true;
+      }
       if (firstType == ResultColumn.ColumnType.AGGREGATION
           || secondType == ResultColumn.ColumnType.AGGREGATION
-          || thirdType == ResultColumn.ColumnType.AGGREGATION) aggregationFlag = true;
-      if (rawFlag && aggregationFlag)
+          || thirdType == ResultColumn.ColumnType.AGGREGATION) {
+        aggregationFlag = true;
+      }
+      if (rawFlag && aggregationFlag) {
         throw new SemanticException(
             "Raw data and aggregation result hybrid calculation is not supported.");
+      }
       if (firstType == ResultColumn.ColumnType.CONSTANT
           && secondType == ResultColumn.ColumnType.CONSTANT
           && thirdType == ResultColumn.ColumnType.CONSTANT) {
         throw new SemanticException("Constant column is not supported.");
       }
-      if (firstType != ResultColumn.ColumnType.CONSTANT) return firstType;
-      if (secondType != ResultColumn.ColumnType.CONSTANT) return secondType;
+      if (firstType != ResultColumn.ColumnType.CONSTANT) {
+        return firstType;
+      }
+      if (secondType != ResultColumn.ColumnType.CONSTANT) {
+        return secondType;
+      }
       return thirdType;
     } else if (expression instanceof BinaryExpression) {
       ResultColumn.ColumnType leftType =
@@ -1026,9 +1035,9 @@ public class ExpressionAnalyzer {
       Expression firstExpression =
           removeAliasFromExpression(((TernaryExpression) expression).getFirstExpression());
       Expression secondExpression =
-          removeAliasFromExpression(((TernaryExpression) expression).getFirstExpression());
+          removeAliasFromExpression(((TernaryExpression) expression).getSecondExpression());
       Expression thirdExpression =
-          removeAliasFromExpression(((TernaryExpression) expression).getFirstExpression());
+          removeAliasFromExpression(((TernaryExpression) expression).getThirdExpression());
       return reconstructTernaryExpressions(
               expression,
               Collections.singletonList(firstExpression),
@@ -1110,7 +1119,7 @@ public class ExpressionAnalyzer {
           getDeviceNameInSourceExpression(((TernaryExpression) expression).getFirstExpression());
       if (DeviceName == null) {
         DeviceName =
-            getDeviceNameInSourceExpression(((TernaryExpression) expression).getFirstExpression());
+            getDeviceNameInSourceExpression(((TernaryExpression) expression).getSecondExpression());
       }
       if (DeviceName == null) {
         DeviceName =
@@ -1143,9 +1152,9 @@ public class ExpressionAnalyzer {
       Expression firstExpression =
           getMeasurementExpression(((TernaryExpression) expression).getFirstExpression());
       Expression secondExpression =
-          getMeasurementExpression(((TernaryExpression) expression).getFirstExpression());
+          getMeasurementExpression(((TernaryExpression) expression).getSecondExpression());
       Expression thirdExpression =
-          getMeasurementExpression(((TernaryExpression) expression).getFirstExpression());
+          getMeasurementExpression(((TernaryExpression) expression).getThirdExpression());
       return reconstructTernaryExpressions(
               expression,
               Collections.singletonList(firstExpression),