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