Skip to content

Commit 1ee0542

Browse files
committed
Don't use unresolve attribute
1 parent e28b084 commit 1ee0542

1 file changed

Lines changed: 23 additions & 50 deletions

File tree

  • sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)