From: Tom Lane Date: Thu, 3 Nov 2005 17:34:03 +0000 (+0000) Subject: Fix the recently-added code that eliminates unnecessary SubqueryScan nodes X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=b17ae35d0df107488af15db05e1d01dad2040d1c;p=users%2Fbernd%2Fpostgres.git Fix the recently-added code that eliminates unnecessary SubqueryScan nodes 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. --- diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index bd09e9b698..5b2156ee29 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -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 {