diff options
author | Cheng Lian <lian@databricks.com> | 2016-06-29 19:08:36 +0800 |
---|---|---|
committer | Wenchen Fan <wenchen@databricks.com> | 2016-06-29 19:08:36 +0800 |
commit | d1e8108854deba3de8e2d87eb4389d11fb17ee57 (patch) | |
tree | 8930e6485000191cf6dd3854a93ef3b19214387c /sql/catalyst/src/main | |
parent | 757dc2c09d23400dacac22e51f52062bbe471136 (diff) | |
download | spark-d1e8108854deba3de8e2d87eb4389d11fb17ee57.tar.gz spark-d1e8108854deba3de8e2d87eb4389d11fb17ee57.tar.bz2 spark-d1e8108854deba3de8e2d87eb4389d11fb17ee57.zip |
[SPARK-16291][SQL] CheckAnalysis should capture nested aggregate functions that reference no input attributes
## What changes were proposed in this pull request?
`MAX(COUNT(*))` is invalid since aggregate expression can't be nested within another aggregate expression. This case should be captured at analysis phase, but somehow sneaks off to runtime.
The reason is that when checking aggregate expressions in `CheckAnalysis`, a checking branch treats all expressions that reference no input attributes as valid ones. However, `MAX(COUNT(*))` is translated into `MAX(COUNT(1))` at analysis phase and also references no input attribute.
This PR fixes this issue by removing the aforementioned branch.
## How was this patch tested?
New test case added in `AnalysisErrorSuite`.
Author: Cheng Lian <lian@databricks.com>
Closes #13968 from liancheng/spark-16291-nested-agg-functions.
Diffstat (limited to 'sql/catalyst/src/main')
-rw-r--r-- | sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala index ac9693e079..7b30fcc6c5 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala @@ -206,7 +206,6 @@ trait CheckAnalysis extends PredicateHelper { "Add to group by or wrap in first() (or first_value) if you don't care " + "which value you get.") case e if groupingExprs.exists(_.semanticEquals(e)) => // OK - case e if e.references.isEmpty => // OK case e => e.children.foreach(checkValidAggregateExpression) } |