From: Tom Lane Date: Wed, 23 Nov 2005 20:28:05 +0000 (+0000) Subject: Get rid of ExecAssignResultTypeFromOuterPlan() and make all plan node types X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=d8677760aa7621e2b1f0fedef81098730601b13e;p=users%2Fbernd%2Fpostgres.git Get rid of ExecAssignResultTypeFromOuterPlan() and make all plan node types generate their output tuple descriptors from their target lists (ie, using ExecAssignResultTypeFromTL()). We long ago fixed things so that all node types have minimally valid tlists, so there's no longer any good reason to have two different ways of doing it. This change is needed to fix bug reported by Hayden James: the fix of 2005-11-03 to emit the correct column names after optimizing away a SubqueryScan node didn't work if the new top-level plan node used ExecAssignResultTypeFromOuterPlan to generate its tupdesc, since the next plan node down won't have the correct column labels. --- diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index e73b347e09..a9b245d4b3 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -435,22 +435,6 @@ ExecAssignResultType(PlanState *planstate, ExecSetSlotDescriptor(slot, tupDesc, shouldFree); } -/* ---------------- - * ExecAssignResultTypeFromOuterPlan - * ---------------- - */ -void -ExecAssignResultTypeFromOuterPlan(PlanState *planstate) -{ - PlanState *outerPlan; - TupleDesc tupDesc; - - outerPlan = outerPlanState(planstate); - tupDesc = ExecGetResultType(outerPlan); - - ExecAssignResultType(planstate, tupDesc, false); -} - /* ---------------- * ExecAssignResultTypeFromTL * ---------------- diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 34e0ce8a93..d0fe9704d1 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -164,7 +164,7 @@ ExecInitHash(Hash *node, EState *estate) * initialize tuple type. no need to initialize projection info because * this node doesn't do projections */ - ExecAssignResultTypeFromOuterPlan(&hashstate->ps); + ExecAssignResultTypeFromTL(&hashstate->ps); hashstate->ps.ps_ProjInfo = NULL; return hashstate; diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 13cbf76445..5769384600 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -327,7 +327,7 @@ ExecInitLimit(Limit *node, EState *estate) * limit nodes do no projections, so initialize projection info for this * node appropriately */ - ExecAssignResultTypeFromOuterPlan(&limitstate->ps); + ExecAssignResultTypeFromTL(&limitstate->ps); limitstate->ps.ps_ProjInfo = NULL; return limitstate; diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 9e84dcd780..10517f5fa5 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -195,7 +195,7 @@ ExecInitMaterial(Material *node, EState *estate) * initialize tuple type. no need to initialize projection info because * this node doesn't do projections. */ - ExecAssignResultTypeFromOuterPlan(&matstate->ss.ps); + ExecAssignResultTypeFromTL(&matstate->ss.ps); ExecAssignScanTypeFromOuterPlan(&matstate->ss); matstate->ss.ps.ps_ProjInfo = NULL; diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c index d962af713d..991ad9cc86 100644 --- a/src/backend/executor/nodeSetOp.c +++ b/src/backend/executor/nodeSetOp.c @@ -258,7 +258,7 @@ ExecInitSetOp(SetOp *node, EState *estate) * setop nodes do no projections, so initialize projection info for this * node appropriately */ - ExecAssignResultTypeFromOuterPlan(&setopstate->ps); + ExecAssignResultTypeFromTL(&setopstate->ps); setopstate->ps.ps_ProjInfo = NULL; /* diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index d27207b1d2..2d228652f6 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -193,7 +193,7 @@ ExecInitSort(Sort *node, EState *estate) * initialize tuple type. no need to initialize projection info because * this node doesn't do projections. */ - ExecAssignResultTypeFromOuterPlan(&sortstate->ss.ps); + ExecAssignResultTypeFromTL(&sortstate->ss.ps); ExecAssignScanTypeFromOuterPlan(&sortstate->ss); sortstate->ss.ps.ps_ProjInfo = NULL; diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c index 8c5c50127b..3e6999daed 100644 --- a/src/backend/executor/nodeUnique.c +++ b/src/backend/executor/nodeUnique.c @@ -150,7 +150,7 @@ ExecInitUnique(Unique *node, EState *estate) * unique nodes do no projections, so initialize projection info for this * node appropriately */ - ExecAssignResultTypeFromOuterPlan(&uniquestate->ps); + ExecAssignResultTypeFromTL(&uniquestate->ps); uniquestate->ps.ps_ProjInfo = NULL; /* diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 031e313167..75fefa4a4f 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -218,7 +218,6 @@ extern ExprContext *MakePerTupleExprContext(EState *estate); extern void ExecAssignExprContext(EState *estate, PlanState *planstate); extern void ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc, bool shouldFree); -extern void ExecAssignResultTypeFromOuterPlan(PlanState *planstate); extern void ExecAssignResultTypeFromTL(PlanState *planstate); extern TupleDesc ExecGetResultType(PlanState *planstate); extern ProjectionInfo *ExecBuildProjectionInfo(List *targetList,