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

caogaofei pushed a commit to branch fix_having
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/fix_having by this push:
     new b5b089a3dfd fix not exist having
b5b089a3dfd is described below

commit b5b089a3dfd538d3b50e75105f7066c3beba2ac4
Author: Beyyes <[email protected]>
AuthorDate: Sun Oct 27 23:01:41 2024 +0800

    fix not exist having
---
 .../db/queryengine/plan/analyze/AnalyzeVisitor.java   | 12 ++++++++----
 .../db/queryengine/plan/analyze/ExpressionUtils.java  | 19 +++++++++++++++----
 .../AlignByDeviceOrderByLimitOffsetTest.java          |  2 +-
 3 files changed, 24 insertions(+), 9 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index a98afe09f58..f4eebc7b07b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -219,6 +219,7 @@ import static 
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionTypeAnalyze
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetDevice;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetMeasurement;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetPath;
+import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.ConstantOperand.FALSE;
 import static 
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
 import static 
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
 import static 
org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSourcePathsVisitor.getSourcePaths;
@@ -397,8 +398,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         // analyze aggregation input
         analyzeGroupBy(analysis, queryStatement, schemaTree, context);
         analyzeWhere(analysis, queryStatement, schemaTree, context);
-        if (analysis.getWhereExpression() != null
-            && analysis.getWhereExpression().equals(ConstantOperand.FALSE)) {
+        if (analysis.getWhereExpression() != null && 
analysis.getWhereExpression().equals(FALSE)) {
           return finishQuery(queryStatement, analysis, outputExpressions);
         }
         analyzeSourceTransform(analysis, outputExpressions, queryStatement);
@@ -1103,7 +1103,11 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       }
     }
 
-    havingExpression = PredicateUtils.combineConjuncts(new 
ArrayList<>(conJunctions));
+    if (conJunctions.isEmpty()) {
+      havingExpression = FALSE;
+    } else {
+      havingExpression = PredicateUtils.combineConjuncts(new 
ArrayList<>(conJunctions));
+    }
     TSDataType outputType = analyzeExpressionType(analysis, havingExpression);
     if (outputType != TSDataType.BOOLEAN) {
       throw new SemanticException(
@@ -1500,7 +1504,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       PartialPath devicePath = deviceIterator.next();
       Expression whereExpression =
           analyzeWhereSplitByDevice(queryStatement, devicePath, schemaTree, 
queryContext);
-      if (whereExpression.equals(ConstantOperand.FALSE)) {
+      if (whereExpression.equals(FALSE)) {
         deviceIterator.remove();
       } else if (whereExpression.equals(ConstantOperand.TRUE)) {
         deviceToWhereExpression.put(devicePath.getIDeviceIDAsFullDevice(), 
null);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
index 6d76384c1c8..e8eb2d69760 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
@@ -200,11 +200,22 @@ public class ExpressionUtils {
       final List<Expression> rightExpressions,
       final MPPQueryContext queryContext) {
     List<Expression> resultExpressions = new ArrayList<>();
-    for (Expression le : leftExpressions) {
+    if (!leftExpressions.isEmpty() && !rightExpressions.isEmpty()) {
+      for (Expression le : leftExpressions) {
+        for (Expression re : rightExpressions) {
+          resultExpressions.add(
+              reserveMemoryForExpression(
+                  queryContext, reconstructBinaryExpression(expression, le, 
re)));
+        }
+      }
+      return resultExpressions;
+    } else if (!leftExpressions.isEmpty()) {
+      for (Expression le : leftExpressions) {
+        resultExpressions.add(reserveMemoryForExpression(queryContext, le));
+      }
+    } else if (!rightExpressions.isEmpty()) {
       for (Expression re : rightExpressions) {
-        resultExpressions.add(
-            reserveMemoryForExpression(
-                queryContext, reconstructBinaryExpression(expression, le, 
re)));
+        resultExpressions.add(reserveMemoryForExpression(queryContext, re));
       }
     }
     return resultExpressions;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AlignByDeviceOrderByLimitOffsetTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AlignByDeviceOrderByLimitOffsetTest.java
index cff70fc457c..41712e261b2 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AlignByDeviceOrderByLimitOffsetTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AlignByDeviceOrderByLimitOffsetTest.java
@@ -701,7 +701,7 @@ public class AlignByDeviceOrderByLimitOffsetTest {
     // aggregation + order by time + having, has LIMIT
     // SingleDeviceViewNode + MergeSortNode
     sql =
-        "select count(s1) from root.sg.d1,root.sg.d22,root.sg.d333 
having(count(s1)>1) ORDER BY TIME DESC  LIMIT 10 align by device";
+        "select count(s1) from root.sg.d1,root.sg.d22,root.sg.d333 
having(count(s1) > 1 or count(s_not_exist) > 1) ORDER BY TIME DESC LIMIT 10 
align by device";
     analysis = Util.analyze(sql, context);
     logicalPlanNode = Util.genLogicalPlan(analysis, context);
     planner = new DistributionPlanner(analysis, new LogicalQueryPlan(context, 
logicalPlanNode));

Reply via email to