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