This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/fixHaving in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 75f032dd48bb2ed4fea6236c3fce6763d247e991 Author: Minghui Liu <[email protected]> AuthorDate: Tue Feb 7 09:28:06 2023 +0800 fix removeWildcardInFilter --- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 2 +- .../db/mpp/plan/analyze/ExpressionAnalyzer.java | 33 ++++++---------------- .../db/mpp/plan/statement/crud/QueryStatement.java | 8 ++++++ 3 files changed, 18 insertions(+), 25 deletions(-) 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 3ad3545145..72edbcd3a2 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 @@ -562,7 +562,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> queryStatement.getHavingCondition().getPredicate(), queryStatement.getFromComponent().getPrefixPaths(), schemaTree, - false); + true); Expression havingExpression = ExpressionUtils.constructQueryFilter( conJunctions.stream().distinct().collect(Collectors.toList())); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java index 3cbafc4948..54acc3431a 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java @@ -488,42 +488,30 @@ public class ExpressionAnalyzer { * @return the expression list with full path and after binding schema */ public static List<Expression> removeWildcardInFilter( - Expression predicate, - List<PartialPath> prefixPaths, - ISchemaTree schemaTree, - boolean isWhere) { + Expression predicate, List<PartialPath> prefixPaths, ISchemaTree schemaTree, boolean isRoot) { if (predicate instanceof TernaryExpression) { List<Expression> firstExpressions = removeWildcardInFilter( - ((TernaryExpression) predicate).getFirstExpression(), - prefixPaths, - schemaTree, - isWhere); + ((TernaryExpression) predicate).getFirstExpression(), prefixPaths, schemaTree, false); List<Expression> secondExpressions = removeWildcardInFilter( ((TernaryExpression) predicate).getSecondExpression(), prefixPaths, schemaTree, - isWhere); + false); List<Expression> thirdExpressions = removeWildcardInFilter( - ((TernaryExpression) predicate).getThirdExpression(), - prefixPaths, - schemaTree, - isWhere); + ((TernaryExpression) predicate).getThirdExpression(), prefixPaths, schemaTree, false); return reconstructTernaryExpressions( predicate, firstExpressions, secondExpressions, thirdExpressions); } else if (predicate instanceof BinaryExpression) { List<Expression> leftExpressions = removeWildcardInFilter( - ((BinaryExpression) predicate).getLeftExpression(), prefixPaths, schemaTree, isWhere); + ((BinaryExpression) predicate).getLeftExpression(), prefixPaths, schemaTree, false); List<Expression> rightExpressions = removeWildcardInFilter( - ((BinaryExpression) predicate).getRightExpression(), - prefixPaths, - schemaTree, - isWhere); - if (predicate.getExpressionType() == ExpressionType.LOGIC_AND) { + ((BinaryExpression) predicate).getRightExpression(), prefixPaths, schemaTree, false); + if (isRoot && predicate.getExpressionType() == ExpressionType.LOGIC_AND) { List<Expression> resultExpressions = new ArrayList<>(leftExpressions); resultExpressions.addAll(rightExpressions); return resultExpressions; @@ -533,16 +521,13 @@ public class ExpressionAnalyzer { } else if (predicate instanceof UnaryExpression) { List<Expression> childExpressions = removeWildcardInFilter( - ((UnaryExpression) predicate).getExpression(), prefixPaths, schemaTree, isWhere); + ((UnaryExpression) predicate).getExpression(), prefixPaths, schemaTree, false); return reconstructUnaryExpressions((UnaryExpression) predicate, childExpressions); } else if (predicate instanceof FunctionExpression) { - if (predicate.isBuiltInAggregationFunctionExpression() && isWhere) { - throw new SemanticException("aggregate functions are not supported in WHERE clause"); - } List<List<Expression>> extendedExpressions = new ArrayList<>(); for (Expression suffixExpression : predicate.getExpressions()) { extendedExpressions.add( - removeWildcardInFilter(suffixExpression, prefixPaths, schemaTree, isWhere)); + removeWildcardInFilter(suffixExpression, prefixPaths, schemaTree, false)); } List<List<Expression>> childExpressionsList = new ArrayList<>(); cartesianProduct(extendedExpressions, childExpressionsList, 0, new ArrayList<>()); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java index bc2c9006ae..abbe93356f 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java @@ -384,6 +384,14 @@ public class QueryStatement extends Statement { } } + if (hasWhere()) { + Expression whereExpression = getWhereCondition().getPredicate(); + if (ExpressionAnalyzer.identifyOutputColumnType(whereExpression, true) + == ResultColumn.ColumnType.AGGREGATION) { + throw new SemanticException("aggregate functions are not supported in WHERE clause"); + } + } + if (hasHaving()) { Expression havingExpression = getHavingCondition().getPredicate(); if (ExpressionAnalyzer.identifyOutputColumnType(havingExpression, true)
