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

[iotdb] branch master updated: [IOTDB-5018] Fix NPE when using uppercase function name in GROUP BY LEVEL (#8108)

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

hui 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 ea1500ed72 [IOTDB-5018] Fix NPE when using uppercase function name in GROUP BY LEVEL (#8108)
ea1500ed72 is described below

commit ea1500ed726dfba76b4e26b6c51719ff1a46f46b
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Wed Nov 23 14:17:25 2022 +0800

    [IOTDB-5018] Fix NPE when using uppercase function name in GROUP BY LEVEL (#8108)
---
 .../db/it/aligned/IoTDBGroupByLevelQueryIT.java    | 39 ++++++++++++++++++----
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  | 20 +++++++++--
 2 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBGroupByLevelQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBGroupByLevelQueryIT.java
index 06c25d88fa..a49168f137 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBGroupByLevelQueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBGroupByLevelQueryIT.java
@@ -38,6 +38,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
 import static org.apache.iotdb.itbase.constant.TestConstant.NULL;
 
 @RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
 public class IoTDBGroupByLevelQueryIT {
 
   protected static boolean enableSeqSpaceCompaction;
@@ -98,7 +99,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void countFuncByLevelTest() {
     // level = 1
     double[][] retArray1 = new double[][] {{39, 20}};
@@ -135,7 +135,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void sumFuncByLevelTest() {
     // level = 1
     double[][] retArray1 = new double[][] {{131111, 510}};
@@ -169,7 +168,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void avgFuncByLevelTest() {
     // level = 1
     double[][] retArray1 = new double[][] {{2260.53448275862, 25.5}};
@@ -203,7 +201,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void timeFuncGroupByLevelTest() {
     double[][] retArray1 = new double[][] {{1, 40, 1, 30}};
     String[] columnNames1 = {
@@ -217,7 +214,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void valueFuncGroupByLevelTest() {
     double[][] retArray1 = new double[][] {{40, 230000, 30, 30}};
     String[] columnNames1 = {
@@ -233,7 +229,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({ClusterIT.class})
   public void nestedQueryTest1() {
     // level = 1
     double[][] retArray1 = new double[][] {{40.0, 21.0}};
@@ -255,7 +250,6 @@ public class IoTDBGroupByLevelQueryIT {
   }
 
   @Test
-  @Category({ClusterIT.class})
   public void nestedQueryTest2() {
     // level = 1
     double[][] retArray1 = new double[][] {{390423.0, 449.0, 390404.0, 430.0}};
@@ -285,4 +279,35 @@ public class IoTDBGroupByLevelQueryIT {
     resultSetEqualTest(
         "select count(s1) + sum(s1) from root.*.* group by level=3", retArray3, columnNames3);
   }
+
+  @Test
+  public void caseSensitivityTest() {
+    double[][] retArray = new double[][] {{39, 20, 39, 20, 39, 20}};
+
+    String[] columnNames1 = {
+      "count(root.sg1.*.s1)",
+      "count(root.sg2.*.s1)",
+      "COUNT(root.sg1.*.s1)",
+      "COUNT(root.sg2.*.s1)",
+      "cOuNt(root.sg1.*.s1)",
+      "cOuNt(root.sg2.*.s1)"
+    };
+    resultSetEqualTest(
+        "select count(s1), COUNT(s1), cOuNt(s1) from root.*.* group by level=1",
+        retArray,
+        columnNames1);
+
+    String[] columnNames2 = {
+      "Count(root.sg1.*.s1)",
+      "Count(root.sg2.*.s1)",
+      "COUNT(root.sg1.*.s1)",
+      "COUNT(root.sg2.*.s1)",
+      "cOuNt(root.sg1.*.s1)",
+      "cOuNt(root.sg2.*.s1)"
+    };
+    resultSetEqualTest(
+        "select Count(s1), COUNT(s1), cOuNt(s1) from root.*.* group by level=1",
+        retArray,
+        columnNames2);
+  }
 }
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 0c49d50a4e..9bd95df7b6 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
@@ -625,6 +625,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       analyzeExpression(analysis, havingExpression);
       analysis.setHavingExpression(havingExpression);
       updateGroupByLevelExpressions(
+          analysis,
           havingExpression,
           groupByLevelExpressions,
           groupByLevelController.getGroupedExpressionToRawExpressionsMap());
@@ -648,7 +649,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
         analyzeExpression(analysis, groupedExpressionWithoutAlias);
         outputExpressions.add(outputExpression);
         updateGroupByLevelExpressions(
-            groupedExpressionWithoutAlias,
+            analysis,
+            groupedExpression,
             groupByLevelExpressions,
             groupByLevelController.getGroupedExpressionToRawExpressionsMap());
         paginationController.consumeLimit();
@@ -678,14 +680,26 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void updateGroupByLevelExpressions(
+      Analysis analysis,
       Expression expression,
       Map<Expression, Set<Expression>> groupByLevelExpressions,
       Map<Expression, Set<Expression>> groupedExpressionToRawExpressionsMap) {
     for (Expression groupedAggregationExpression :
         ExpressionAnalyzer.searchAggregationExpressions(expression)) {
+      Set<Expression> groupedExpressionSet =
+          groupedExpressionToRawExpressionsMap.get(groupedAggregationExpression).stream()
+              .map(ExpressionAnalyzer::removeAliasFromExpression)
+              .collect(Collectors.toSet());
+      Expression groupedAggregationExpressionWithoutAlias =
+          ExpressionAnalyzer.removeAliasFromExpression(groupedAggregationExpression);
+
+      analyzeExpression(analysis, groupedAggregationExpressionWithoutAlias);
+      groupedExpressionSet.forEach(
+          groupedExpression -> analyzeExpression(analysis, groupedExpression));
+
       groupByLevelExpressions
-          .computeIfAbsent(groupedAggregationExpression, key -> new HashSet<>())
-          .addAll(groupedExpressionToRawExpressionsMap.get(groupedAggregationExpression));
+          .computeIfAbsent(groupedAggregationExpressionWithoutAlias, key -> new HashSet<>())
+          .addAll(groupedExpressionSet);
     }
   }