From d060e921ea5aa47b6265174c32e1128cebdbc3df Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Thu, 28 Sep 2023 09:44:39 +0900 Subject: [PATCH] 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 --- src/backend/executor/execProcnode.c | 18 +++++-------- src/backend/executor/execUtils.c | 26 ------------------- src/backend/executor/nodeAgg.c | 10 ------- src/backend/executor/nodeBitmapHeapscan.c | 12 --------- src/backend/executor/nodeBitmapIndexscan.c | 8 ------ src/backend/executor/nodeCtescan.c | 12 --------- src/backend/executor/nodeCustom.c | 7 ----- src/backend/executor/nodeForeignscan.c | 8 ------ src/backend/executor/nodeFunctionscan.c | 15 ----------- src/backend/executor/nodeGather.c | 3 --- src/backend/executor/nodeGatherMerge.c | 3 --- src/backend/executor/nodeGroup.c | 5 ---- src/backend/executor/nodeHash.c | 5 ---- src/backend/executor/nodeHashjoin.c | 12 --------- src/backend/executor/nodeIncrementalSort.c | 5 ---- src/backend/executor/nodeIndexonlyscan.c | 16 ------------ src/backend/executor/nodeIndexscan.c | 16 ------------ src/backend/executor/nodeLimit.c | 1 - src/backend/executor/nodeMaterial.c | 5 ---- src/backend/executor/nodeMemoize.c | 9 ------- src/backend/executor/nodeMergejoin.c | 11 -------- src/backend/executor/nodeModifyTable.c | 11 -------- .../executor/nodeNamedtuplestorescan.c | 22 ---------------- src/backend/executor/nodeNestloop.c | 10 ------- src/backend/executor/nodeProjectSet.c | 10 ------- src/backend/executor/nodeResult.c | 10 ------- src/backend/executor/nodeSamplescan.c | 12 --------- src/backend/executor/nodeSeqscan.c | 12 --------- src/backend/executor/nodeSetOp.c | 4 --- src/backend/executor/nodeSort.c | 7 ----- src/backend/executor/nodeSubqueryscan.c | 12 --------- src/backend/executor/nodeTableFuncscan.c | 12 --------- src/backend/executor/nodeTidrangescan.c | 12 --------- src/backend/executor/nodeTidscan.c | 12 --------- src/backend/executor/nodeUnique.c | 5 ---- src/backend/executor/nodeValuesscan.c | 24 ----------------- src/backend/executor/nodeWindowAgg.c | 17 ------------ src/backend/executor/nodeWorktablescan.c | 22 ---------------- src/include/executor/executor.h | 1 - .../executor/nodeNamedtuplestorescan.h | 1 - src/include/executor/nodeValuesscan.h | 1 - src/include/executor/nodeWorktablescan.h | 1 - 42 files changed, 6 insertions(+), 419 deletions(-) diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 4d288bc8d41f5..b4b5c562c0f2a 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -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; diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index c06b228858335..16704c0c2f183 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -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 diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 468db94fe5ba0..f154f28902850 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -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); } diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index f35df0b8bfb47..2db0acfc76ac2 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -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 */ diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c index 83ec9ede899ec..7cf8532bc9590 100644 --- a/src/backend/executor/nodeBitmapIndexscan.c +++ b/src/backend/executor/nodeBitmapIndexscan.c @@ -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) */ diff --git a/src/backend/executor/nodeCtescan.c b/src/backend/executor/nodeCtescan.c index cc4c4243e2fb5..a0c0c4be337d7 100644 --- a/src/backend/executor/nodeCtescan.c +++ b/src/backend/executor/nodeCtescan.c @@ -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. */ diff --git a/src/backend/executor/nodeCustom.c b/src/backend/executor/nodeCustom.c index bd42c65b29385..28b5bb9353ab2 100644 --- a/src/backend/executor/nodeCustom.c +++ b/src/backend/executor/nodeCustom.c @@ -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 diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c index c2139acca0752..73913ebb18423 100644 --- a/src/backend/executor/nodeForeignscan.c +++ b/src/backend/executor/nodeForeignscan.c @@ -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); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeFunctionscan.c b/src/backend/executor/nodeFunctionscan.c index dd06ef8aee868..2dddbcda14123 100644 --- a/src/backend/executor/nodeFunctionscan.c +++ b/src/backend/executor/nodeFunctionscan.c @@ -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); diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index 307fc10eea7bd..bb2500a469041 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -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); } /* diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c index 9d5e1a46e9e2a..7a71a58509cb0 100644 --- a/src/backend/executor/nodeGatherMerge.c +++ b/src/backend/executor/nodeGatherMerge.c @@ -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); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index 25a1618952e6b..8c650f0e46d58 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -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); } diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 8b5c35b82b884..e72f0986c268f 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -415,11 +415,6 @@ ExecEndHash(HashState *node) { PlanState *outerPlan; - /* - * free exprcontext - */ - ExecFreeExprContext(&node->ps); - /* * shut down the subplan */ diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 980746128bcbe..aea44a9d566aa 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -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 */ diff --git a/src/backend/executor/nodeIncrementalSort.c b/src/backend/executor/nodeIncrementalSort.c index 7683e3341cde9..cd094a190cb6a 100644 --- a/src/backend/executor/nodeIncrementalSort.c +++ b/src/backend/executor/nodeIncrementalSort.c @@ -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); diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c index 0b43a9b969901..f1db35665c8bc 100644 --- a/src/backend/executor/nodeIndexonlyscan.c +++ b/src/backend/executor/nodeIndexonlyscan.c @@ -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) */ diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 4540c7781d2d2..14b9c00217a84 100644 --- a/src/backend/executor/nodeIndexscan.c +++ b/src/backend/executor/nodeIndexscan.c @@ -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) */ diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 425fbfc405fda..5654158e3e937 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -534,7 +534,6 @@ ExecInitLimit(Limit *node, EState *estate, int eflags) void ExecEndLimit(LimitState *node) { - ExecFreeExprContext(&node->ps); ExecEndNode(outerPlanState(node)); } diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 09632678b0332..753ea289151d1 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -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 */ diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index 4f04269e2621b..94bf4792873a8 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -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 */ diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 00f96d045e0bb..ed3ebe92e528f 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -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 */ diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 5005d8c0d12ca..d21a178ad5a06 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -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 */ diff --git a/src/backend/executor/nodeNamedtuplestorescan.c b/src/backend/executor/nodeNamedtuplestorescan.c index 46832ad82fbcc..3547dc2b10ea9 100644 --- a/src/backend/executor/nodeNamedtuplestorescan.c +++ b/src/backend/executor/nodeNamedtuplestorescan.c @@ -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 * diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c index b3d52e69ecb70..ebd1406843b56 100644 --- a/src/backend/executor/nodeNestloop.c +++ b/src/backend/executor/nodeNestloop.c @@ -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 */ diff --git a/src/backend/executor/nodeProjectSet.c b/src/backend/executor/nodeProjectSet.c index f6ff3dc44c1ca..b4bbdc89b19cf 100644 --- a/src/backend/executor/nodeProjectSet.c +++ b/src/backend/executor/nodeProjectSet.c @@ -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 */ diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c index 4219712d306f9..e9f5732f33b90 100644 --- a/src/backend/executor/nodeResult.c +++ b/src/backend/executor/nodeResult.c @@ -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 */ diff --git a/src/backend/executor/nodeSamplescan.c b/src/backend/executor/nodeSamplescan.c index d7e22b1dbbaeb..41c1ea37ad482 100644 --- a/src/backend/executor/nodeSamplescan.c +++ b/src/backend/executor/nodeSamplescan.c @@ -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 */ diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c index 4da0f28f7baa6..49a5933aff698 100644 --- a/src/backend/executor/nodeSeqscan.c +++ b/src/backend/executor/nodeSeqscan.c @@ -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 */ diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c index 4bc2406b89817..98c1b84d43638 100644 --- a/src/backend/executor/nodeSetOp.c +++ b/src/backend/executor/nodeSetOp.c @@ -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)); } diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index c6c72c6e67852..eea7f2ae15027 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -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 */ diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c index 42471bfc041c7..1ee62956601c7 100644 --- a/src/backend/executor/nodeSubqueryscan.c +++ b/src/backend/executor/nodeSubqueryscan.c @@ -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 */ diff --git a/src/backend/executor/nodeTableFuncscan.c b/src/backend/executor/nodeTableFuncscan.c index 791cbd2372400..a60dcd49434fd 100644 --- a/src/backend/executor/nodeTableFuncscan.c +++ b/src/backend/executor/nodeTableFuncscan.c @@ -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 */ diff --git a/src/backend/executor/nodeTidrangescan.c b/src/backend/executor/nodeTidrangescan.c index 2124c55ef53ec..da622d3f5f3f4 100644 --- a/src/backend/executor/nodeTidrangescan.c +++ b/src/backend/executor/nodeTidrangescan.c @@ -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); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 862bd0330bc7b..15055077d0324 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -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); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c index 45035d74fa719..01f951197c16d 100644 --- a/src/backend/executor/nodeUnique.c +++ b/src/backend/executor/nodeUnique.c @@ -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)); } diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c index 32ace6301754c..fbfb067f3beba 100644 --- a/src/backend/executor/nodeValuesscan.c +++ b/src/backend/executor/nodeValuesscan.c @@ -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 * diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 310ac23e3a134..77724a6daaffe 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -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) diff --git a/src/backend/executor/nodeWorktablescan.c b/src/backend/executor/nodeWorktablescan.c index 0c13448236a80..17a548865ed65 100644 --- a/src/backend/executor/nodeWorktablescan.c +++ b/src/backend/executor/nodeWorktablescan.c @@ -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 * diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index c677e490d7622..aeebe0e0ff98b 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -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, diff --git a/src/include/executor/nodeNamedtuplestorescan.h b/src/include/executor/nodeNamedtuplestorescan.h index 3ff687023afa2..9d80236fe5f0a 100644 --- a/src/include/executor/nodeNamedtuplestorescan.h +++ b/src/include/executor/nodeNamedtuplestorescan.h @@ -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 */ diff --git a/src/include/executor/nodeValuesscan.h b/src/include/executor/nodeValuesscan.h index a52fa678dfe12..fe3f043951bca 100644 --- a/src/include/executor/nodeValuesscan.h +++ b/src/include/executor/nodeValuesscan.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 */ diff --git a/src/include/executor/nodeWorktablescan.h b/src/include/executor/nodeWorktablescan.h index e553a453f3488..f31b22cec4a07 100644 --- a/src/include/executor/nodeWorktablescan.h +++ b/src/include/executor/nodeWorktablescan.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 */