diff --git a/fe/src/main/java/org/apache/doris/analysis/Expr.java b/fe/src/main/java/org/apache/doris/analysis/Expr.java index 0866fe555a..8be5f09bbb 100644 --- a/fe/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/src/main/java/org/apache/doris/analysis/Expr.java @@ -123,6 +123,24 @@ abstract public class Expr extends TreeNode implements ParseNode, Cloneabl } }; */ + // Returns true if an Expr is a builtin aggregate function. + public final static com.google.common.base.Predicate IS_BUILTIN_AGG_FN = + new com.google.common.base.Predicate() { + @Override + public boolean apply(Expr arg) { + if (arg instanceof FunctionCallExpr) { + String fnName = ((FunctionCallExpr)arg).getFnName().getFunction(); + return (fnName.equalsIgnoreCase("sum") + || fnName.equalsIgnoreCase("max") + || fnName.equalsIgnoreCase("min") + || fnName.equalsIgnoreCase("avg") + || fnName.equalsIgnoreCase("count")); + } else { + return false; + } + } + }; + public final static com.google.common.base.Predicate IS_TRUE_LITERAL = new com.google.common.base.Predicate() { diff --git a/fe/src/main/java/org/apache/doris/analysis/StmtRewriter.java b/fe/src/main/java/org/apache/doris/analysis/StmtRewriter.java index 34101df358..aa995269ae 100644 --- a/fe/src/main/java/org/apache/doris/analysis/StmtRewriter.java +++ b/fe/src/main/java/org/apache/doris/analysis/StmtRewriter.java @@ -744,10 +744,17 @@ public class StmtRewriter { Preconditions.checkNotNull(stmt); // Grouping and/or aggregation (including analytic functions) is only // allowed on correlated EXISTS subqueries - if ((expr instanceof BinaryPredicate - && (stmt.hasAggInfo() || stmt.hasAnalyticInfo())) - || (expr instanceof InPredicate - && (stmt.hasAggInfo() || stmt.hasAnalyticInfo()))) { + if (expr instanceof BinaryPredicate) { + if (stmt.getSelectList().getItems().size() != 1) { + throw new AnalysisException("The subquery only support one item in select clause"); + } + SelectListItem item = stmt.getSelectList().getItems().get(0); + if (!item.getExpr().contains(Expr.IS_BUILTIN_AGG_FN)) { + throw new AnalysisException("The select item of correlated subquery should only be sum, min, max, avg" + + " and count. Current subquery:" + stmt.toSql()); + } + } + if (expr instanceof InPredicate && (stmt.hasAggInfo() || stmt.hasAnalyticInfo())) { LOG.warn("canRewriteCorrelatedSubquery fail, expr={} subquery={}", expr.toSql(), stmt.toSql()); throw new AnalysisException("Unsupported correlated subquery with grouping " + "and/or aggregation: "