Skip to content

Commit 4b140f6

Browse files
committed
SPARK-27909: Update CTE substitution to be independent.
1 parent 955eef9 commit 4b140f6

File tree

1 file changed

+12
-9
lines changed
  • sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis

1 file changed

+12
-9
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -215,23 +215,26 @@ class Analyzer(
215215
object CTESubstitution extends Rule[LogicalPlan] {
216216
def apply(plan: LogicalPlan): LogicalPlan = plan.resolveOperatorsUp {
217217
case With(child, relations) =>
218-
substituteCTE(child, relations.foldLeft(Seq.empty[(String, LogicalPlan)]) {
219-
case (resolved, (name, relation)) =>
220-
resolved :+ name -> executeSameContext(substituteCTE(relation, resolved))
221-
})
218+
// substitute CTE expressions right-to-left to resolve references to previous CTEs:
219+
// with a as (select * from t) with b as (select * from a) select * from b
220+
relations.reverse.foldLeft(child) {
221+
case (currentPlan, (cteName, ctePlan)) =>
222+
substituteCTE(currentPlan, cteName, ctePlan)
223+
}
222224
case other => other
223225
}
224226

225-
def substituteCTE(plan: LogicalPlan, cteRelations: Seq[(String, LogicalPlan)]): LogicalPlan = {
226-
plan resolveOperatorsDown {
227+
def substituteCTE(plan: LogicalPlan, cteName: String, ctePlan: LogicalPlan): LogicalPlan = {
228+
plan resolveOperatorsUp {
229+
case UnresolvedRelation(TableIdentifier(table, None)) if resolver(cteName, table) =>
230+
ctePlan
227231
case u: UnresolvedRelation =>
228-
cteRelations.find(x => resolver(x._1, u.tableIdentifier.table))
229-
.map(_._2).getOrElse(u)
232+
u
230233
case other =>
231234
// This cannot be done in ResolveSubquery because ResolveSubquery does not know the CTE.
232235
other transformExpressions {
233236
case e: SubqueryExpression =>
234-
e.withNewPlan(substituteCTE(e.plan, cteRelations))
237+
e.withNewPlan(substituteCTE(e.plan, cteName, ctePlan))
235238
}
236239
}
237240
}

0 commit comments

Comments
 (0)