@@ -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