This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch rel/1.2
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/1.2 by this push:
new 9a07aee90d7 [To rel/1.2][IOTDB-5983] Refactor error info in GROUP
BY/ORDER BY in align by device
9a07aee90d7 is described below
commit 9a07aee90d745009f279dd6859a47f59091b12de
Author: YangCaiyin <[email protected]>
AuthorDate: Mon Jun 19 09:17:01 2023 +0800
[To rel/1.2][IOTDB-5983] Refactor error info in GROUP BY/ORDER BY in align
by device
---
.../db/it/groupby/IoTDBGroupByConditionIT.java | 44 +++++++++++++
.../iotdb/db/it/groupby/IoTDBGroupByCountIT.java | 44 +++++++++++++
.../db/it/groupby/IoTDBGroupByVariationIT.java | 23 ++++++-
.../apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java | 74 ++++++++++++++++------
.../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 23 +++++--
.../db/mpp/plan/statement/crud/QueryStatement.java | 24 ++++---
6 files changed, 193 insertions(+), 39 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByConditionIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByConditionIT.java
index fdbea94e8c9..f518749b032 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByConditionIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByConditionIT.java
@@ -407,4 +407,48 @@ public class IoTDBGroupByConditionIT {
fail(e.getMessage());
}
}
+
+ private void errorTest(String sql, String error) {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeQuery(sql);
+ } catch (Exception e) {
+ assertEquals(error, e.getMessage());
+ }
+ }
+
+ @Test
+ public void errorTest1() {
+ errorTest(
+ "select first_value(soc) from root.** group by
condition(charging_status!=0,KEEP>2,ignoreNull=false)",
+ "701: root.**.charging_status != 0 in group by clause shouldn't refer
to more than one timeseries.");
+ }
+
+ @Test
+ public void errorTest2() {
+ errorTest(
+ "select first_value(soc) from root.sg.beijing.car01 group by
condition(count(charging_status)!=0,KEEP>2,ignoreNull=false)",
+ "701: Aggregation expression shouldn't exist in group by clause");
+ }
+
+ @Test
+ public void errorTest3() {
+ errorTest(
+ "select first_value(soc) from root.sg.beijing.car01 group by
condition(s1!=0,KEEP>2,ignoreNull=false)",
+ "701: root.sg.beijing.car01.s1 != 0 in group by clause doesn't
exist.");
+ }
+
+ @Test
+ public void errorTest4() {
+ errorTest(
+ "select first_value(soc) from root.sg.beijing.car01 group by
condition(s1!=0,KEEP>2,ignoreNull=false) align by device",
+ "701: s1 != 0 in group by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest5() {
+ errorTest(
+ "select first_value(soc) from root.sg.beijing.car01 group by
condition(root.sg.beijing.car01.soc!=0,KEEP>2,ignoreNull=false) align by
device",
+ "701: ALIGN BY DEVICE: the suffix paths can only be measurement or
one-level wildcard");
+ }
}
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByCountIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByCountIT.java
index 5b59486db72..92af9934da9 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByCountIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByCountIT.java
@@ -411,4 +411,48 @@ public class IoTDBGroupByCountIT {
normalTestWithAlignByDevice(res, sql, false);
normalTestWithAlignByDevice(res, sql2, true);
}
+
+ private void errorTest(String sql, String error) {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeQuery(sql);
+ } catch (Exception e) {
+ assertEquals(error, e.getMessage());
+ }
+ }
+
+ @Test
+ public void errorTest1() {
+ errorTest(
+ "select count(temperature) from root.** group by count(soc, 2)",
+ "701: root.**.soc in group by clause shouldn't refer to more than one
timeseries.");
+ }
+
+ @Test
+ public void errorTest2() {
+ errorTest(
+ "select count(soc) from root.sg.beijing.car01 group by
count(count(soc),2)",
+ "701: Aggregation expression shouldn't exist in group by clause");
+ }
+
+ @Test
+ public void errorTest3() {
+ errorTest(
+ "select count(soc) from root.sg.beijing.car01 group by count(s1,2)",
+ "701: root.sg.beijing.car01.s1 in group by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest4() {
+ errorTest(
+ "select count(soc) from root.sg.beijing.car01 group by count(s1,2)
align by device",
+ "701: s1 in group by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest5() {
+ errorTest(
+ "select count(soc) from root.sg.beijing.car01 group by
count(root.sg.beijing.car01.soc,2) align by device",
+ "701: ALIGN BY DEVICE: the suffix paths can only be measurement or
one-level wildcard");
+ }
}
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByVariationIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByVariationIT.java
index ffc7b5d703f..090dfcaefca 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByVariationIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByVariationIT.java
@@ -486,7 +486,7 @@ public class IoTDBGroupByVariationIT {
public void errorTest1() {
errorTest(
"select avg(temperature) from root.ln.wf01.wt01 group by variation(*)",
- "701: Expression in group by should indicate one value");
+ "701: root.ln.wf01.wt01.* in group by clause shouldn't refer to more
than one timeseries.");
}
@Test
@@ -496,6 +496,27 @@ public class IoTDBGroupByVariationIT {
"701: Aggregation expression shouldn't exist in group by clause");
}
+ @Test
+ public void errorTest3() {
+ errorTest(
+ "select avg(temperature) from root.ln.wf01.wt01 group by
variation(s1,2)",
+ "701: root.ln.wf01.wt01.s1 in group by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest4() {
+ errorTest(
+ "select avg(temperature) from root.ln.wf01.wt01 group by
variation(s1,2) align by device",
+ "701: s1 in group by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest5() {
+ errorTest(
+ "select avg(temperature) from root.ln.wf01.wt01 group by
variation(root.ln.wf01.wt01.s1,2) align by device",
+ "701: ALIGN BY DEVICE: the suffix paths can only be measurement or
one-level wildcard");
+ }
+
@Test
public void groupByVariationWithDoubleTest() {
String[][] res =
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
index 762b0bb1203..454879aea90 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
@@ -1224,30 +1224,62 @@ public class IoTDBOrderByIT {
orderByUDFTest(sql, ans);
}
- @Test
- public void errorTest1() {
- String sql = "select num from root.sg.d order by avg(bigNum)";
+ private void errorTest(String sql, String error) {
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
- try (ResultSet resultSet = statement.executeQuery(sql)) {
- fail();
- }
+ statement.executeQuery(sql);
} catch (Exception e) {
- assertEquals("701: Raw data and aggregation hybrid query is not
supported.", e.getMessage());
+ assertEquals(error, e.getMessage());
}
}
+ @Test
+ public void errorTest1() {
+ errorTest(
+ "select num from root.sg.d order by avg(bigNum)",
+ "701: Raw data and aggregation hybrid query is not supported.");
+ }
+
@Test
public void errorTest2() {
- String sql = "select avg(num) from root.sg.d order by bigNum";
- try (Connection connection = EnvFactory.getEnv().getConnection();
- Statement statement = connection.createStatement()) {
- try (ResultSet resultSet = statement.executeQuery(sql)) {
- fail();
- }
- } catch (Exception e) {
- assertEquals("701: Raw data and aggregation hybrid query is not
supported.", e.getMessage());
- }
+ errorTest(
+ "select avg(num) from root.sg.d order by bigNum",
+ "701: Raw data and aggregation hybrid query is not supported.");
+ }
+
+ @Test
+ public void errorTest3() {
+ errorTest(
+ "select bigNum,floatNum from root.sg.d order by s1",
+ "701: root.sg.d.s1 in order by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest4() {
+ errorTest(
+ "select bigNum,floatNum from root.** order by bigNum",
+ "701: root.**.bigNum in order by clause shouldn't refer to more than
one timeseries.");
+ }
+
+ @Test
+ public void errorTest5() {
+ errorTest(
+ "select bigNum,floatNum from root.** order by s1 align by device",
+ "701: s1 in order by clause doesn't exist.");
+ }
+
+ @Test
+ public void errorTest6() {
+ errorTest(
+ "select bigNum,floatNum from root.** order by root.sg.d.bigNum align
by device",
+ "701: ALIGN BY DEVICE: the suffix paths can only be measurement or
one-level wildcard");
+ }
+
+ @Test
+ public void errorTest7() {
+ errorTest(
+ "select last bigNum,floatNum from root.** order by root.sg.d.bigNum",
+ "701: root.sg.d.bigNum in order by clause doesn't exist in the result
of last query.");
}
// last query
@@ -1279,7 +1311,7 @@ public class IoTDBOrderByIT {
@Test
public void lastQueryOrderBy() {
- String ans[][] =
+ String[][] ans =
new String[][] {
{"51536000000", "51536000000", "51536000000", "51536000000"},
{"root.sg.d.num", "root.sg.d2.num", "root.sg.d.bigNum",
"root.sg.d2.bigNum"},
@@ -1292,7 +1324,7 @@ public class IoTDBOrderByIT {
@Test
public void lastQueryOrderBy2() {
- String ans[][] =
+ String[][] ans =
new String[][] {
{"51536000000", "51536000000", "51536000000", "51536000000"},
{"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num",
"root.sg.d.bigNum"},
@@ -1305,7 +1337,7 @@ public class IoTDBOrderByIT {
@Test
public void lastQueryOrderBy3() {
- String ans[][] =
+ String[][] ans =
new String[][] {
{"51536000000", "51536000000", "51536000000", "51536000000"},
{"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num",
"root.sg.d.bigNum"},
@@ -1318,7 +1350,7 @@ public class IoTDBOrderByIT {
@Test
public void lastQueryOrderBy4() {
- String ans[][] =
+ String[][] ans =
new String[][] {
{"51536000000", "51536000000", "51536000000", "51536000000"},
{"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum",
"root.sg.d.bigNum"},
@@ -1331,7 +1363,7 @@ public class IoTDBOrderByIT {
@Test
public void lastQueryOrderBy5() {
- String ans[][] =
+ String[][] ans =
new String[][] {
{"51536000000", "51536000000", "51536000000", "51536000000"},
{"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum",
"root.sg.d.bigNum"},
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index 94d6e0a483b..1077f471912 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -1350,8 +1350,15 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
ExpressionAnalyzer.concatDeviceAndBindSchemaForExpression(
expression, device, schemaTree);
- if (groupByExpressionsOfOneDevice.size() != 1) {
- throw new SemanticException("Expression in group by should indicate
one value");
+ if (groupByExpressionsOfOneDevice.size() == 0) {
+ throw new SemanticException(
+ String.format("%s in group by clause doesn't exist.",
expression));
+ }
+ if (groupByExpressionsOfOneDevice.size() > 1) {
+ throw new SemanticException(
+ String.format(
+ "%s in group by clause shouldn't refer to more than one
timeseries.",
+ expression));
}
Expression groupByExpressionOfOneDevice =
groupByExpressionsOfOneDevice.get(0);
@@ -1472,8 +1479,16 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
// Expression in group by variation clause only indicates one column
List<Expression> expressions =
ExpressionAnalyzer.bindSchemaForExpression(groupByExpression,
schemaTree);
- if (expressions.size() != 1) {
- throw new SemanticException("Expression in group by should indicate
one value");
+ if (expressions.size() == 0) {
+ throw new SemanticException(
+ String.format(
+ "%s in group by clause doesn't exist.",
groupByExpression.getExpressionString()));
+ }
+ if (expressions.size() > 1) {
+ throw new SemanticException(
+ String.format(
+ "%s in group by clause shouldn't refer to more than one
timeseries.",
+ groupByExpression.getExpressionString()));
}
// Aggregation expression shouldn't exist in group by clause.
List<Expression> aggregationExpression =
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
index 3b7fe31c517..2f22bff1549 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
@@ -223,10 +223,6 @@ public class QueryStatement extends Statement {
this.orderByComponent = orderByComponent;
}
- public ResultSetFormat getResultSetFormat() {
- return resultSetFormat;
- }
-
public void setResultSetFormat(ResultSetFormat resultSetFormat) {
this.resultSetFormat = resultSetFormat;
}
@@ -311,9 +307,7 @@ public class QueryStatement extends Statement {
private boolean hasAggregationFunction(Expression expression) {
if (expression instanceof FunctionExpression) {
- if (!expression.isBuiltInAggregationFunctionExpression()) {
- return false;
- }
+ return expression.isBuiltInAggregationFunctionExpression();
} else {
if (expression instanceof TimeSeriesOperand) {
return false;
@@ -335,10 +329,6 @@ public class QueryStatement extends Statement {
return !getExpressionSortItemList().isEmpty();
}
- public boolean isAlignByTime() {
- return resultSetFormat == ResultSetFormat.ALIGN_BY_TIME;
- }
-
public boolean isAlignByDevice() {
return resultSetFormat == ResultSetFormat.ALIGN_BY_DEVICE;
}
@@ -431,8 +421,7 @@ public class QueryStatement extends Statement {
List<SortItem> sortItems = getSortItemList();
List<SortItem> newSortItems = new ArrayList<>();
int expressionIndex = 0;
- for (int i = 0; i < sortItems.size(); i++) {
- SortItem sortItem = sortItems.get(i);
+ for (SortItem sortItem : sortItems) {
SortItem newSortItem =
new SortItem(sortItem.getSortKey(), sortItem.getOrdering(),
sortItem.getNullOrdering());
if (sortItem.isExpression()) {
@@ -575,6 +564,15 @@ public class QueryStatement extends Statement {
for (ResultColumn resultColumn : selectComponent.getResultColumns()) {
ExpressionAnalyzer.checkIsAllMeasurement(resultColumn.getExpression());
}
+ if (hasGroupByExpression()) {
+ ExpressionAnalyzer.checkIsAllMeasurement(
+ getGroupByComponent().getControlColumnExpression());
+ }
+ if (hasOrderByExpression()) {
+ for (Expression expression : getExpressionSortItemList()) {
+ ExpressionAnalyzer.checkIsAllMeasurement(expression);
+ }
+ }
if (getWhereCondition() != null) {
ExpressionAnalyzer.checkIsAllMeasurement(getWhereCondition().getPredicate());
}