@@ -1484,63 +1484,36 @@ class Analyzer(
14841484 // Skip the having clause here, this will be handled in ResolveAggregateFunctions.
14851485 case h : UnresolvedHaving => h
14861486
1487- case p : LogicalPlan if needResolveStructField(p) =>
1488- logTrace(s " Attempting to resolve ${p.simpleString(SQLConf .get.maxToStringFields)}" )
1489- val resolved = p.mapExpressions(resolveExpressionTopDown(_, p))
1490- val structFieldMap = mutable.Map [String , Alias ]()
1491- resolved.transformExpressions {
1492- case a @ Alias (struct : GetStructField , _) =>
1493- if (structFieldMap.contains(struct.sql)) {
1494- val exprId = structFieldMap.getOrElse(struct.sql, a).exprId
1495- Alias (a.child, a.name)(exprId, a.qualifier, a.explicitMetadata)
1496- } else {
1497- structFieldMap += (struct.sql -> a)
1498- a
1499- }
1500- case e => e
1501- }
1502-
15031487 case q : LogicalPlan =>
15041488 logTrace(s " Attempting to resolve ${q.simpleString(SQLConf .get.maxToStringFields)}" )
1505- q.mapExpressions(resolveExpressionTopDown(_, q))
1489+ val resolved = q.mapExpressions(resolveExpressionTopDown(_, q))
1490+ if (needResolveStructField(q)) {
1491+ resolveStructField(resolved)
1492+ } else {
1493+ resolved
1494+ }
15061495 }
15071496
1508- private def needResolveStructField (plan : LogicalPlan ): Boolean = {
1509- plan match {
1510- case Aggregate (groupingExpressions, aggregateExpressions, _)
1511- if containSameStructFields(groupingExpressions.flatMap(_.references),
1512- aggregateExpressions.flatMap(_.references)) => true
1513- case GroupingSets (selectedGroupByExprs, groupByExprs, _, aggregations)
1514- if containSameStructFields(groupByExprs.flatMap(_.references),
1515- aggregations.flatMap(_.references),
1516- Some (selectedGroupByExprs.flatMap(_.flatMap(_.references)))) => true
1517- case _ => false
1497+ private def resolveStructField (plan : LogicalPlan ): LogicalPlan = {
1498+ val structFieldMap = mutable.Map [String , Alias ]()
1499+ plan.transformExpressionsDown {
1500+ case a @ Alias (struct : GetStructField , _) =>
1501+ if (structFieldMap.contains(struct.sql)) {
1502+ val exprId = structFieldMap.getOrElse(struct.sql, a).exprId
1503+ Alias (a.child, a.name)(exprId, a.qualifier, a.explicitMetadata)
1504+ } else {
1505+ structFieldMap += (struct.sql -> a)
1506+ a
1507+ }
1508+ case e => e
15181509 }
15191510 }
15201511
1521- private def containSameStructFields (
1522- groupExprs : Seq [Attribute ],
1523- aggExprs : Seq [Attribute ],
1524- extra : Option [Seq [Attribute ]] = None ): Boolean = {
1525-
1526- def isStructField (attr : Attribute ): Boolean = {
1527- attr.isInstanceOf [UnresolvedAttribute ] &&
1528- attr.asInstanceOf [UnresolvedAttribute ].nameParts.size == 2
1529- }
1530-
1531- val grpAttrs = groupExprs.filter(isStructField)
1532- .map(_.asInstanceOf [UnresolvedAttribute ].name)
1533- val aggAttrs = aggExprs.filter(isStructField)
1534- .map(_.asInstanceOf [UnresolvedAttribute ].name)
1535- val havingAttrs = extra.getOrElse(Seq .empty[Attribute ]).filter(isStructField)
1536- .map(_.asInstanceOf [UnresolvedAttribute ].name)
1537-
1538- if (extra.isDefined) {
1539- grpAttrs.exists(aggAttrs.contains)
1540- } else {
1541- grpAttrs.exists(aggAttrs.contains) ||
1542- grpAttrs.exists(havingAttrs.contains) ||
1543- aggAttrs.exists(havingAttrs.contains)
1512+ private def needResolveStructField (plan : LogicalPlan ): Boolean = {
1513+ plan match {
1514+ case Aggregate (_, _, _) => true
1515+ case GroupingSets (_, _, _, _) => true
1516+ case _ => false
15441517 }
15451518 }
15461519
0 commit comments