From bba63770ba061c3056e7e998640740f0a0018ada Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Fri, 15 Aug 2025 15:54:42 -0700 Subject: [PATCH 1/2] release memory in ExecShutdownHashJoin(). --- src/backend/executor/execProcnode.c | 4 +++- src/backend/executor/nodeHash.c | 3 +++ src/backend/executor/nodeHashjoin.c | 3 +++ src/include/nodes/execnodes.h | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index f5f9cfbeead..e21a037e9e2 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -777,7 +777,7 @@ ExecShutdownNode(PlanState *node) static bool ExecShutdownNode_walker(PlanState *node, void *context) { - if (node == NULL) + if (node == NULL || node->shutdown) return false; check_stack_depth(); @@ -825,6 +825,8 @@ ExecShutdownNode_walker(PlanState *node, void *context) if (node->instrument && node->instrument->running) InstrStopNode(node->instrument, 0); + node->shutdown = true; + return false; } diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 8d2201ab67f..7c22dd035bc 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -164,7 +164,10 @@ MultiExecPrivateHash(HashState *node) slot = ExecProcNode(outerNode); if (TupIsNull(slot)) + { + ExecShutdownNode(outerNode); break; + } /* We have to compute the hash value */ econtext->ecxt_outertuple = slot; diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 5661ad76830..cf3c5e5cc6f 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -1591,6 +1591,9 @@ ExecShutdownHashJoin(HashJoinState *node) */ ExecHashTableDetachBatch(node->hj_HashTable); ExecHashTableDetach(node->hj_HashTable); + + ExecHashTableDestroy(node->hj_HashTable); + node->hj_HashTable = NULL; } } diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index e107d6e5f81..4e45faa4a66 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -1205,6 +1205,8 @@ typedef struct PlanState bool async_capable; /* true if node is async-capable */ + bool shutdown; /* ExecShutdownNode() called */ + /* * Scanslot's descriptor if known. This is a bit of a hack, but otherwise * it's hard for expression compilation to optimize based on the -- 2.43.0