]> granicus.if.org Git - postgresql/commitdiff
Fix the recently-added code that eliminates unnecessary SubqueryScan nodes
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Nov 2005 17:34:03 +0000 (17:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Nov 2005 17:34:03 +0000 (17:34 +0000)
from a finished plan tree.  We have to copy the output column names
(resname fields) from the SubqueryScan down to its child plan node;
else, if this is the topmost level of the plan, the wrong column names
will be delivered to the client.  Per bug #2017 reported by Jolly Chen.

src/backend/optimizer/plan/setrefs.c

index 2ca616e118b9f81fcc86bf839d3dd004f6edf588..9f078924c2533b5cd824492fde52068caddaea62 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.115 2005/10/15 02:49:20 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.116 2005/11/03 17:34:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -359,6 +359,8 @@ set_subqueryscan_references(SubqueryScan *plan, List *rtable)
                 */
                int                     rtoffset = list_length(rtable);
                List       *sub_rtable;
+               ListCell   *lp,
+                                  *lc;
 
                sub_rtable = copyObject(rte->subquery->rtable);
                range_table_walker(sub_rtable,
@@ -378,6 +380,19 @@ set_subqueryscan_references(SubqueryScan *plan, List *rtable)
 
                result->initPlan = list_concat(plan->scan.plan.initPlan,
                                                                           result->initPlan);
+
+               /*
+                * we also have to transfer the SubqueryScan's result-column names
+                * into the subplan, else columns sent to client will be improperly
+                * labeled if this is the topmost plan level.
+                */
+               forboth(lp, plan->scan.plan.targetlist, lc, result->targetlist)
+               {
+                       TargetEntry *ptle = (TargetEntry *) lfirst(lp);
+                       TargetEntry *ctle = (TargetEntry *) lfirst(lc);
+
+                       ctle->resname = ptle->resname;
+               }
        }
        else
        {