mirror of
https://github.com/postgres/postgres.git
synced 2025-06-03 01:21:48 +03:00
Remove obsolete executor cleanup code
This commit removes unnecessary ExecExprFreeContext() calls in ExecEnd* routines because the actual cleanup is managed by FreeExecutorState(). With no callers remaining for ExecExprFreeContext(), this commit also removes the function. This commit also drops redundant ExecClearTuple() calls, because ExecResetTupleTable() in ExecEndPlan() already takes care of resetting and dropping all TupleTableSlots initialized with ExecInitScanTupleSlot() and ExecInitExtraTupleSlot(). After these modifications, the ExecEnd*() routines for ValuesScan, NamedTuplestoreScan, and WorkTableScan became redundant. So, this commit removes them. Reviewed-by: Robert Haas Discussion: https://postgr.es/m/CA+HiwqFGkMSge6TgC9KQzde0ohpAycLQuV7ooitEEpbKB0O_mg@mail.gmail.com
This commit is contained in:
parent
9210afd3bc
commit
d060e921ea
@ -667,22 +667,10 @@ ExecEndNode(PlanState *node)
|
||||
ExecEndTableFuncScan((TableFuncScanState *) node);
|
||||
break;
|
||||
|
||||
case T_ValuesScanState:
|
||||
ExecEndValuesScan((ValuesScanState *) node);
|
||||
break;
|
||||
|
||||
case T_CteScanState:
|
||||
ExecEndCteScan((CteScanState *) node);
|
||||
break;
|
||||
|
||||
case T_NamedTuplestoreScanState:
|
||||
ExecEndNamedTuplestoreScan((NamedTuplestoreScanState *) node);
|
||||
break;
|
||||
|
||||
case T_WorkTableScanState:
|
||||
ExecEndWorkTableScan((WorkTableScanState *) node);
|
||||
break;
|
||||
|
||||
case T_ForeignScanState:
|
||||
ExecEndForeignScan((ForeignScanState *) node);
|
||||
break;
|
||||
@ -757,6 +745,12 @@ ExecEndNode(PlanState *node)
|
||||
ExecEndLimit((LimitState *) node);
|
||||
break;
|
||||
|
||||
/* No clean up actions for these nodes. */
|
||||
case T_ValuesScanState:
|
||||
case T_NamedTuplestoreScanState:
|
||||
case T_WorkTableScanState:
|
||||
break;
|
||||
|
||||
default:
|
||||
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
|
||||
break;
|
||||
|
@ -638,32 +638,6 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, int varno, TupleDesc tupdesc)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* ExecFreeExprContext
|
||||
*
|
||||
* A plan node's ExprContext should be freed explicitly during executor
|
||||
* shutdown because there may be shutdown callbacks to call. (Other resources
|
||||
* made by the above routines, such as projection info, don't need to be freed
|
||||
* explicitly because they're just memory in the per-query memory context.)
|
||||
*
|
||||
* However ... there is no particular need to do it during ExecEndNode,
|
||||
* because FreeExecutorState will free any remaining ExprContexts within
|
||||
* the EState. Letting FreeExecutorState do it allows the ExprContexts to
|
||||
* be freed in reverse order of creation, rather than order of creation as
|
||||
* will happen if we delete them here, which saves O(N^2) work in the list
|
||||
* cleanup inside FreeExprContext.
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
ExecFreeExprContext(PlanState *planstate)
|
||||
{
|
||||
/*
|
||||
* Per above discussion, don't actually delete the ExprContext. We do
|
||||
* unlink it from the plan node, though.
|
||||
*/
|
||||
planstate->ps_ExprContext = NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Scan node support
|
||||
|
@ -4357,16 +4357,6 @@ ExecEndAgg(AggState *node)
|
||||
if (node->hashcontext)
|
||||
ReScanExprContext(node->hashcontext);
|
||||
|
||||
/*
|
||||
* We don't actually free any ExprContexts here (see comment in
|
||||
* ExecFreeExprContext), just unlinking the output one from the plan node
|
||||
* suffices.
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/* clean up tuple table */
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
outerPlan = outerPlanState(node);
|
||||
ExecEndNode(outerPlan);
|
||||
}
|
||||
|
@ -655,18 +655,6 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
|
||||
*/
|
||||
scanDesc = node->ss.ss_currentScanDesc;
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clear out tuple table slots
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close down subplans
|
||||
*/
|
||||
|
@ -184,14 +184,6 @@ ExecEndBitmapIndexScan(BitmapIndexScanState *node)
|
||||
indexRelationDesc = node->biss_RelationDesc;
|
||||
indexScanDesc = node->biss_ScanDesc;
|
||||
|
||||
/*
|
||||
* Free the exprcontext ... now dead code, see ExecFreeExprContext
|
||||
*/
|
||||
#ifdef NOT_USED
|
||||
if (node->biss_RuntimeContext)
|
||||
FreeExprContext(node->biss_RuntimeContext, true);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* close the index relation (no-op if we didn't open it)
|
||||
*/
|
||||
|
@ -287,18 +287,6 @@ ExecInitCteScan(CteScan *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndCteScan(CteScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* If I am the leader, free the tuplestore.
|
||||
*/
|
||||
|
@ -129,13 +129,6 @@ ExecEndCustomScan(CustomScanState *node)
|
||||
{
|
||||
Assert(node->methods->EndCustomScan != NULL);
|
||||
node->methods->EndCustomScan(node);
|
||||
|
||||
/* Free the exprcontext */
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/* Clean out the tuple table */
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -312,14 +312,6 @@ ExecEndForeignScan(ForeignScanState *node)
|
||||
/* Shut down any outer plan. */
|
||||
if (outerPlanState(node))
|
||||
ExecEndNode(outerPlanState(node));
|
||||
|
||||
/* Free the exprcontext */
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/* clean out the tuple table */
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@ -523,18 +523,6 @@ ExecEndFunctionScan(FunctionScanState *node)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* Release slots and tuplestore resources
|
||||
*/
|
||||
@ -542,9 +530,6 @@ ExecEndFunctionScan(FunctionScanState *node)
|
||||
{
|
||||
FunctionScanPerFuncState *fs = &node->funcstates[i];
|
||||
|
||||
if (fs->func_slot)
|
||||
ExecClearTuple(fs->func_slot);
|
||||
|
||||
if (fs->tstore != NULL)
|
||||
{
|
||||
tuplestore_end(node->funcstates[i].tstore);
|
||||
|
@ -250,9 +250,6 @@ ExecEndGather(GatherState *node)
|
||||
{
|
||||
ExecEndNode(outerPlanState(node)); /* let children clean up first */
|
||||
ExecShutdownGather(node);
|
||||
ExecFreeExprContext(&node->ps);
|
||||
if (node->ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -290,9 +290,6 @@ ExecEndGatherMerge(GatherMergeState *node)
|
||||
{
|
||||
ExecEndNode(outerPlanState(node)); /* let children clean up first */
|
||||
ExecShutdownGatherMerge(node);
|
||||
ExecFreeExprContext(&node->ps);
|
||||
if (node->ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@ -228,11 +228,6 @@ ExecEndGroup(GroupState *node)
|
||||
{
|
||||
PlanState *outerPlan;
|
||||
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/* clean up tuple table */
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
outerPlan = outerPlanState(node);
|
||||
ExecEndNode(outerPlan);
|
||||
}
|
||||
|
@ -415,11 +415,6 @@ ExecEndHash(HashState *node)
|
||||
{
|
||||
PlanState *outerPlan;
|
||||
|
||||
/*
|
||||
* free exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
/*
|
||||
* shut down the subplan
|
||||
*/
|
||||
|
@ -867,18 +867,6 @@ ExecEndHashJoin(HashJoinState *node)
|
||||
node->hj_HashTable = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->js.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->js.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->hj_OuterTupleSlot);
|
||||
ExecClearTuple(node->hj_HashTupleSlot);
|
||||
|
||||
/*
|
||||
* clean up subtrees
|
||||
*/
|
||||
|
@ -1079,11 +1079,6 @@ ExecEndIncrementalSort(IncrementalSortState *node)
|
||||
{
|
||||
SO_printf("ExecEndIncrementalSort: shutting down sort node\n");
|
||||
|
||||
/* clean out the scan tuple */
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
/* must drop pointer to sort result tuple */
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
/* must drop standalone tuple slots from outer node */
|
||||
ExecDropSingleTupleTableSlot(node->group_pivot);
|
||||
ExecDropSingleTupleTableSlot(node->transfer_tuple);
|
||||
|
||||
|
@ -380,22 +380,6 @@ ExecEndIndexOnlyScan(IndexOnlyScanState *node)
|
||||
node->ioss_VMBuffer = InvalidBuffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the exprcontext(s) ... now dead code, see ExecFreeExprContext
|
||||
*/
|
||||
#ifdef NOT_USED
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
if (node->ioss_RuntimeContext)
|
||||
FreeExprContext(node->ioss_RuntimeContext, true);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* clear out tuple table slots
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close the index relation (no-op if we didn't open it)
|
||||
*/
|
||||
|
@ -794,22 +794,6 @@ ExecEndIndexScan(IndexScanState *node)
|
||||
indexRelationDesc = node->iss_RelationDesc;
|
||||
indexScanDesc = node->iss_ScanDesc;
|
||||
|
||||
/*
|
||||
* Free the exprcontext(s) ... now dead code, see ExecFreeExprContext
|
||||
*/
|
||||
#ifdef NOT_USED
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
if (node->iss_RuntimeContext)
|
||||
FreeExprContext(node->iss_RuntimeContext, true);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* clear out tuple table slots
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close the index relation (no-op if we didn't open it)
|
||||
*/
|
||||
|
@ -534,7 +534,6 @@ ExecInitLimit(Limit *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndLimit(LimitState *node)
|
||||
{
|
||||
ExecFreeExprContext(&node->ps);
|
||||
ExecEndNode(outerPlanState(node));
|
||||
}
|
||||
|
||||
|
@ -239,11 +239,6 @@ ExecInitMaterial(Material *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndMaterial(MaterialState *node)
|
||||
{
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* Release tuplestore resources
|
||||
*/
|
||||
|
@ -1091,15 +1091,6 @@ ExecEndMemoize(MemoizeState *node)
|
||||
/* Remove the cache context */
|
||||
MemoryContextDelete(node->tableContext);
|
||||
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
/* must drop pointer to cache result tuple */
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* free exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* shut down the subplan
|
||||
*/
|
||||
|
@ -1643,17 +1643,6 @@ ExecEndMergeJoin(MergeJoinState *node)
|
||||
MJ1_printf("ExecEndMergeJoin: %s\n",
|
||||
"ending node processing");
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->js.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->js.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->mj_MarkedTupleSlot);
|
||||
|
||||
/*
|
||||
* shut down the subplans
|
||||
*/
|
||||
|
@ -4446,17 +4446,6 @@ ExecEndModifyTable(ModifyTableState *node)
|
||||
ExecDropSingleTupleTableSlot(node->mt_root_tuple_slot);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* Terminate EPQ execution if active
|
||||
*/
|
||||
|
@ -155,28 +155,6 @@ ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflag
|
||||
return scanstate;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecEndNamedTuplestoreScan
|
||||
*
|
||||
* frees any storage allocated through C routines.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecEndNamedTuplestoreScan(NamedTuplestoreScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecReScanNamedTuplestoreScan
|
||||
*
|
||||
|
@ -364,16 +364,6 @@ ExecEndNestLoop(NestLoopState *node)
|
||||
NL1_printf("ExecEndNestLoop: %s\n",
|
||||
"ending node processing");
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->js.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->js.ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* close down subplans
|
||||
*/
|
||||
|
@ -320,16 +320,6 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndProjectSet(ProjectSetState *node)
|
||||
{
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* shut down subplans
|
||||
*/
|
||||
|
@ -240,16 +240,6 @@ ExecInitResult(Result *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndResult(ResultState *node)
|
||||
{
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* shut down subplans
|
||||
*/
|
||||
|
@ -188,18 +188,6 @@ ExecEndSampleScan(SampleScanState *node)
|
||||
if (node->tsmroutine->EndSampleScan)
|
||||
node->tsmroutine->EndSampleScan(node);
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close heap scan
|
||||
*/
|
||||
|
@ -190,18 +190,6 @@ ExecEndSeqScan(SeqScanState *node)
|
||||
*/
|
||||
scanDesc = node->ss.ss_currentScanDesc;
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close heap scan
|
||||
*/
|
||||
|
@ -582,13 +582,9 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndSetOp(SetOpState *node)
|
||||
{
|
||||
/* clean up tuple table */
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
|
||||
/* free subsidiary stuff including hashtable */
|
||||
if (node->tableContext)
|
||||
MemoryContextDelete(node->tableContext);
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
ExecEndNode(outerPlanState(node));
|
||||
}
|
||||
|
@ -303,13 +303,6 @@ ExecEndSort(SortState *node)
|
||||
SO1_printf("ExecEndSort: %s\n",
|
||||
"shutting down sort node");
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
/* must drop pointer to sort result tuple */
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
|
||||
/*
|
||||
* Release tuplesort resources
|
||||
*/
|
||||
|
@ -167,18 +167,6 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndSubqueryScan(SubqueryScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the upper tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* close down subquery
|
||||
*/
|
||||
|
@ -213,18 +213,6 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndTableFuncScan(TableFuncScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
|
||||
/*
|
||||
* Release tuplestore resources
|
||||
*/
|
||||
|
@ -331,18 +331,6 @@ ExecEndTidRangeScan(TidRangeScanState *node)
|
||||
|
||||
if (scan != NULL)
|
||||
table_endscan(scan);
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clear out tuple table slots
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@ -472,18 +472,6 @@ ExecEndTidScan(TidScanState *node)
|
||||
{
|
||||
if (node->ss.ss_currentScanDesc)
|
||||
table_endscan(node->ss.ss_currentScanDesc);
|
||||
|
||||
/*
|
||||
* Free the exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clear out tuple table slots
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@ -168,11 +168,6 @@ ExecInitUnique(Unique *node, EState *estate, int eflags)
|
||||
void
|
||||
ExecEndUnique(UniqueState *node)
|
||||
{
|
||||
/* clean up tuple table */
|
||||
ExecClearTuple(node->ps.ps_ResultTupleSlot);
|
||||
|
||||
ExecFreeExprContext(&node->ps);
|
||||
|
||||
ExecEndNode(outerPlanState(node));
|
||||
}
|
||||
|
||||
|
@ -319,30 +319,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
|
||||
return scanstate;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecEndValuesScan
|
||||
*
|
||||
* frees any storage allocated through C routines.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecEndValuesScan(ValuesScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free both exprcontexts
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
node->ss.ps.ps_ExprContext = node->rowcontext;
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecReScanValuesScan
|
||||
*
|
||||
|
@ -2686,23 +2686,6 @@ ExecEndWindowAgg(WindowAggState *node)
|
||||
|
||||
release_partition(node);
|
||||
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
ExecClearTuple(node->first_part_slot);
|
||||
ExecClearTuple(node->agg_row_slot);
|
||||
ExecClearTuple(node->temp_slot_1);
|
||||
ExecClearTuple(node->temp_slot_2);
|
||||
if (node->framehead_slot)
|
||||
ExecClearTuple(node->framehead_slot);
|
||||
if (node->frametail_slot)
|
||||
ExecClearTuple(node->frametail_slot);
|
||||
|
||||
/*
|
||||
* Free both the expr contexts.
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
node->ss.ps.ps_ExprContext = node->tmpcontext;
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
for (i = 0; i < node->numaggs; i++)
|
||||
{
|
||||
if (node->peragg[i].aggcontext != node->aggcontext)
|
||||
|
@ -181,28 +181,6 @@ ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags)
|
||||
return scanstate;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecEndWorkTableScan
|
||||
*
|
||||
* frees any storage allocated through C routines.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecEndWorkTableScan(WorkTableScanState *node)
|
||||
{
|
||||
/*
|
||||
* Free exprcontext
|
||||
*/
|
||||
ExecFreeExprContext(&node->ss.ps);
|
||||
|
||||
/*
|
||||
* clean out the tuple table
|
||||
*/
|
||||
if (node->ss.ps.ps_ResultTupleSlot)
|
||||
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
|
||||
ExecClearTuple(node->ss.ss_ScanTupleSlot);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecReScanWorkTableScan
|
||||
*
|
||||
|
@ -569,7 +569,6 @@ extern void ExecAssignProjectionInfo(PlanState *planstate,
|
||||
TupleDesc inputDesc);
|
||||
extern void ExecConditionalAssignProjectionInfo(PlanState *planstate,
|
||||
TupleDesc inputDesc, int varno);
|
||||
extern void ExecFreeExprContext(PlanState *planstate);
|
||||
extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc);
|
||||
extern void ExecCreateScanSlotFromOuterPlan(EState *estate,
|
||||
ScanState *scanstate,
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern NamedTuplestoreScanState *ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflags);
|
||||
extern void ExecEndNamedTuplestoreScan(NamedTuplestoreScanState *node);
|
||||
extern void ExecReScanNamedTuplestoreScan(NamedTuplestoreScanState *node);
|
||||
|
||||
#endif /* NODENAMEDTUPLESTORESCAN_H */
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern ValuesScanState *ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags);
|
||||
extern void ExecEndValuesScan(ValuesScanState *node);
|
||||
extern void ExecReScanValuesScan(ValuesScanState *node);
|
||||
|
||||
#endif /* NODEVALUESSCAN_H */
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "nodes/execnodes.h"
|
||||
|
||||
extern WorkTableScanState *ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags);
|
||||
extern void ExecEndWorkTableScan(WorkTableScanState *node);
|
||||
extern void ExecReScanWorkTableScan(WorkTableScanState *node);
|
||||
|
||||
#endif /* NODEWORKTABLESCAN_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user