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),