Skip to content

Commit 6b02a41

Browse files
author
Davies Liu
committed
move to use a special case for Generate in ResolveReferrence
1 parent 887474e commit 6b02a41

File tree

2 files changed

+16
-34
lines changed

2 files changed

+16
-34
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,22 @@ class Analyzer(
378378
val newOrdering = resolveSortOrders(ordering, child, throws = false)
379379
Sort(newOrdering, global, child)
380380

381+
// A special case for Generate, because the output of Generate should not be resolved by
382+
// ResolveReferences.
383+
case g @ Generate(generator, join, outer, qualifier, output, child)
384+
if child.resolved && !generator.resolved =>
385+
val newG = generator transformUp {
386+
case u @ UnresolvedAttribute(nameParts) =>
387+
withPosition(u) { child.resolve(nameParts, resolver).getOrElse(u) }
388+
case UnresolvedExtractValue(child, fieldExpr) =>
389+
ExtractValue(child, fieldExpr, resolver)
390+
}
391+
if (newG.fastEquals(generator)) {
392+
g
393+
} else {
394+
Generate(newG.asInstanceOf[Generator], join, outer, qualifier, output, child)
395+
}
396+
381397
case q: LogicalPlan =>
382398
logTrace(s"Attempting to resolve ${q.simpleString}")
383399
q transformExpressionsUp {

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -75,40 +75,6 @@ case class Generate(
7575
// as that will cause exceptions like unresolved attributes etc.
7676
override def expressions: Seq[Expression] = generator :: Nil
7777

78-
/**
79-
* Runs [[transformUp]] with `rule` on all expressions present in this query operator.
80-
* @param rule the rule to be applied to every expression in this operator.
81-
*
82-
* Note: This is used by ResolveReferences, we need to override it to not resolve
83-
* `generatorOutput`.
84-
*/
85-
override def transformExpressionsUp(rule: PartialFunction[Expression, Expression]): this.type = {
86-
var changed = false
87-
88-
@inline def transformExpressionUp(e: Expression): Expression = {
89-
val newE = e.transformUp(rule)
90-
if (newE.fastEquals(e)) {
91-
e
92-
} else {
93-
changed = true
94-
newE
95-
}
96-
}
97-
98-
def recursiveTransform(arg: Any): AnyRef = arg match {
99-
case e: Expression if expressions.contains(e) => transformExpressionUp(e)
100-
case Some(e: Expression) if expressions.contains(e) => Some(transformExpressionUp(e))
101-
case m: Map[_, _] => m
102-
case d: DataType => d // Avoid unpacking Structs
103-
case seq: Traversable[_] => seq.map(recursiveTransform)
104-
case other: AnyRef => other
105-
}
106-
107-
val newArgs = productIterator.map(recursiveTransform).toArray
108-
109-
if (changed) makeCopy(newArgs).asInstanceOf[this.type] else this
110-
}
111-
11278
def output: Seq[Attribute] = {
11379
val qualified = qualifier.map(q =>
11480
// prepend the new qualifier to the existed one

0 commit comments

Comments
 (0)