You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ne...@apache.org on 2022/11/01 01:20:17 UTC

[iotdb] branch master updated: [IOTDB-4695] GROUP LEVEL query de-duplicates result columns unexpected (#7736)

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

neuyilan 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 bc0e88b878 [IOTDB-4695] GROUP LEVEL query de-duplicates result columns unexpected (#7736)
bc0e88b878 is described below

commit bc0e88b878d8f9c8e75848c3b9531703b05409e8
Author: 任宇华 <79...@users.noreply.github.com>
AuthorDate: Tue Nov 1 09:20:12 2022 +0800

    [IOTDB-4695] GROUP LEVEL query de-duplicates result columns unexpected (#7736)
---
 .../it/aggregation/IoTDBAggregationByLevelIT.java  | 19 ++++++++++
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  | 43 ++++++++++++++--------
 2 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationByLevelIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationByLevelIT.java
index b1d07581ff..a516d80d4a 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationByLevelIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationByLevelIT.java
@@ -33,6 +33,8 @@ import org.junit.runner.RunWith;
 
 import java.sql.Connection;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
 import java.sql.Statement;
 
 import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR;
@@ -674,6 +676,23 @@ public class IoTDBAggregationByLevelIT {
     }
   }
 
+  @Test
+  public void groupByLevelWithSameColumn() throws SQLException {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(status),count(status) from root.** GROUP BY level=0")) {
+
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        Assert.assertEquals(metaData.getColumnName(1), metaData.getColumnName(2));
+        Assert.assertEquals(count("root.*.*.status"), metaData.getColumnName(1));
+        Assert.assertEquals(2, metaData.getColumnCount());
+      }
+    }
+  }
+
   private static void prepareData() {
     try (Connection connection = EnvFactory.getEnv().getConnection();
         Statement statement = connection.createStatement()) {
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 307b9778a5..cf6acaa2f9 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
@@ -137,6 +137,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -244,10 +245,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
 
         analyzeInto(analysis, queryStatement, deviceSet, outputExpressions);
       } else {
-        outputExpressions = analyzeSelect(analysis, queryStatement, schemaTree);
-
+        Map<Integer, List<Pair<Expression, String>>> outputExpressionMap =
+            analyzeSelect(analysis, queryStatement, schemaTree);
+        outputExpressions = new ArrayList<>();
+        outputExpressionMap
+            .values()
+            .forEach(outputExpressionList -> outputExpressions.addAll(outputExpressionList));
         analyzeHaving(analysis, queryStatement, schemaTree);
-        analyzeGroupByLevel(analysis, queryStatement, outputExpressions);
+        analyzeGroupByLevel(analysis, queryStatement, outputExpressionMap, outputExpressions);
         analyzeGroupByTag(analysis, queryStatement, outputExpressions, schemaTree);
         Set<Expression> selectExpressions =
             outputExpressions.stream()
@@ -365,17 +370,18 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return analysis;
   }
 
-  private List<Pair<Expression, String>> analyzeSelect(
+  private Map<Integer, List<Pair<Expression, String>>> analyzeSelect(
       Analysis analysis, QueryStatement queryStatement, ISchemaTree schemaTree) {
-    List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
+    Map<Integer, List<Pair<Expression, String>>> outputExpressionMap = new HashMap<>();
     boolean isGroupByLevel = queryStatement.isGroupByLevel();
     ColumnPaginationController paginationController =
         new ColumnPaginationController(
             queryStatement.getSeriesLimit(),
             queryStatement.getSeriesOffset(),
             queryStatement.isLastQuery() || isGroupByLevel);
-
+    int columnIndex = 0;
     for (ResultColumn resultColumn : queryStatement.getSelectComponent().getResultColumns()) {
+      List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
       boolean hasAlias = resultColumn.hasAlias();
       List<Expression> resultExpressions =
           ExpressionAnalyzer.removeWildcardInExpression(resultColumn.getExpression(), schemaTree);
@@ -415,8 +421,9 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
           break;
         }
       }
+      outputExpressionMap.put(columnIndex++, outputExpressions);
     }
-    return outputExpressions;
+    return outputExpressionMap;
   }
 
   private Set<PartialPath> analyzeFrom(QueryStatement queryStatement, ISchemaTree schemaTree) {
@@ -585,6 +592,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   private void analyzeGroupByLevel(
       Analysis analysis,
       QueryStatement queryStatement,
+      Map<Integer, List<Pair<Expression, String>>> outputExpressionMap,
       List<Pair<Expression, String>> outputExpressions) {
     if (!queryStatement.isGroupByLevel()) {
       return;
@@ -593,14 +601,19 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     GroupByLevelController groupByLevelController =
         new GroupByLevelController(queryStatement.getGroupByLevelComponent().getLevels());
 
-    Set<Expression> groupedSelectExpressions = new LinkedHashSet<>();
-    for (int i = 0; i < outputExpressions.size(); i++) {
-      Pair<Expression, String> expressionAliasPair = outputExpressions.get(i);
-      boolean isCountStar = queryStatement.getGroupByLevelComponent().isCountStar(i);
-      Expression groupedExpression =
-          groupByLevelController.control(
-              isCountStar, expressionAliasPair.left, expressionAliasPair.right);
-      groupedSelectExpressions.add(groupedExpression);
+    List<Expression> groupedSelectExpressions = new LinkedList<>();
+
+    for (List<Pair<Expression, String>> outputExpressionList : outputExpressionMap.values()) {
+      Set<Expression> groupedSelectExpressionSet = new LinkedHashSet<>();
+      for (int i = 0; i < outputExpressionList.size(); i++) {
+        Pair<Expression, String> expressionAliasPair = outputExpressionList.get(i);
+        boolean isCountStar = queryStatement.getGroupByLevelComponent().isCountStar(i);
+        Expression groupedExpression =
+            groupByLevelController.control(
+                isCountStar, expressionAliasPair.left, expressionAliasPair.right);
+        groupedSelectExpressionSet.add(groupedExpression);
+      }
+      groupedSelectExpressions.addAll(groupedSelectExpressionSet);
     }
 
     LinkedHashMap<Expression, Set<Expression>> groupByLevelExpressions = new LinkedHashMap<>();