mirror of https://github.com/postgres/postgres
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:
parent
902377c465
commit
abf293e155
|
@ -9,7 +9,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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);
|
int rtoffset = list_length(rtable);
|
||||||
List *sub_rtable;
|
List *sub_rtable;
|
||||||
|
ListCell *lp,
|
||||||
|
*lc;
|
||||||
|
|
||||||
sub_rtable = copyObject(rte->subquery->rtable);
|
sub_rtable = copyObject(rte->subquery->rtable);
|
||||||
range_table_walker(sub_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 = list_concat(plan->scan.plan.initPlan,
|
||||||
result->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
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue