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.
This commit is contained in:
Tom Lane 2005-11-03 17:34:03 +00:00
parent 902377c465
commit abf293e155
1 changed files with 16 additions and 1 deletions

View 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
{