Un-break EXPLAIN for Append plans. I messed this up a few days ago while
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Oct 2009 18:51:56 +0000 (18:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Oct 2009 18:51:56 +0000 (18:51 +0000)
adding the ModifyTable node type --- I had been thinking ModifyTable should
replace Append as a special case in push_plan(), but actually both of them
have to be special-cased.

src/backend/utils/adt/ruleutils.c

index 99dfd88ba5203b700c433228fae6bf199988020f..adf3e64802640e7ac09f670d8db3733baeb65d21 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.312 2009/10/28 17:36:50 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.313 2009/10/28 18:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3370,11 +3370,16 @@ static void
 push_plan(deparse_namespace *dpns, Plan *subplan)
 {
        /*
-        * We special-case ModifyTable to pretend that the first child plan is the
-        * OUTER referent; otherwise normal.  This is to support RETURNING lists
-        * containing references to non-target relations.
+        * We special-case Append to pretend that the first child plan is the
+        * OUTER referent; we have to interpret OUTER Vars in the Append's tlist
+        * according to one of the children, and the first one is the most
+        * natural choice.  Likewise special-case ModifyTable to pretend that the
+        * first child plan is the OUTER referent; this is to support RETURNING
+        * lists containing references to non-target relations.
         */
-       if (IsA(subplan, ModifyTable))
+       if (IsA(subplan, Append))
+               dpns->outer_plan = (Plan *) linitial(((Append *) subplan)->appendplans);
+       else if (IsA(subplan, ModifyTable))
                dpns->outer_plan = (Plan *) linitial(((ModifyTable *) subplan)->plans);
        else
                dpns->outer_plan = outerPlan(subplan);