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());
         }

Reply via email to