Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 579ee5d

Browse files
committed
Fix memory leak in Memoize cache key evaluation
When probing the Memoize cache to check if the current cache key values exist in the cache, we perform an evaluation of the expressions making up the cache key before probing the hash table for those values. This operation could leak memory as it is possible that the cache key is an expression which requires allocation of memory, as was the case in bug 17844. Here we fix this by correctly switching to the per tuple context before evaluating the cache expressions so that the memory is freed next time the per tuple context is reset. Bug: 17844 Reported-by: Alexey Ermakov Discussion: https://postgr.es/m/17844-d2f6f9e75a622bed@postgresql.org Backpatch-through: 14, where Memoize was introduced
1 parent e060cd5 commit 579ee5d

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/backend/executor/nodeMemoize.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,18 @@ prepare_probe_slot(MemoizeState *mstate, MemoizeKey *key)
289289

290290
if (key == NULL)
291291
{
292+
ExprContext *econtext = mstate->ss.ps.ps_ExprContext;
293+
MemoryContext oldcontext;
294+
295+
oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory);
296+
292297
/* Set the probeslot's values based on the current parameter values */
293298
for (int i = 0; i < numKeys; i++)
294299
pslot->tts_values[i] = ExecEvalExpr(mstate->param_exprs[i],
295-
mstate->ss.ps.ps_ExprContext,
300+
econtext,
296301
&pslot->tts_isnull[i]);
302+
303+
MemoryContextSwitchTo(oldcontext);
297304
}
298305
else
299306
{

0 commit comments

Comments
 (0)