diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala index 91f6a0639013..3e048ed9b693 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala @@ -2553,8 +2553,10 @@ class Analyzer(override val catalogManager: CatalogManager) // a table `t` has two columns `c1` and `c2`, for query `SELECT ... FROM t // GROUP BY c1 HAVING c2 = 0`, even though we can resolve column `c2` here, we // should undo it later and fail with "Column c2 not found". - agg.child.resolve(u.nameParts, resolver).map(TempResolvedColumn(_, u.nameParts)) - .getOrElse(u) + agg.child.resolve(u.nameParts, resolver).map({ + case a: Alias => TempResolvedColumn(a.child, u.nameParts) + case o => TempResolvedColumn(o, u.nameParts) + }).getOrElse(u) } catch { case _: AnalysisException => u } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala index 5cef24310e35..6ddc6b7eb716 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala @@ -1115,4 +1115,30 @@ class AnalysisSuite extends AnalysisTest with Matchers { Seq("grouping_id() can only be used with GroupingSets/Cube/Rollup"), false) } + + test("SPARK-36275: Resolve aggregate functions should work with nested fields") { + assertAnalysisSuccess(parsePlan( + """ + |SELECT c.x, SUM(c.y) + |FROM VALUES NAMED_STRUCT('x', 'A', 'y', 1), NAMED_STRUCT('x', 'A', 'y', 2) AS t(c) + |GROUP BY c.x + |HAVING c.x > 1 + |""".stripMargin)) + + assertAnalysisSuccess(parsePlan( + """ + |SELECT c.x, SUM(c.y) + |FROM VALUES NAMED_STRUCT('x', 'A', 'y', 1), NAMED_STRUCT('x', 'A', 'y', 2) AS t(c) + |GROUP BY c.x + |ORDER BY c.x + |""".stripMargin)) + + assertAnalysisError(parsePlan( + """ + |SELECT c.x + |FROM VALUES NAMED_STRUCT('x', 'A', 'y', 1), NAMED_STRUCT('x', 'A', 'y', 2) AS t(c) + |GROUP BY c.x + |ORDER BY c.x + c.y + |""".stripMargin), "cannot resolve 'c.y' given input columns: [x]" :: Nil) + } }