From c1f8fb9bfb0d2a89f646b3186a004d6e4ebdecb4 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 19 Jun 2014 22:13:47 -0400 Subject: Avoid leaking memory while evaluating arguments for a table function. ExecMakeTableFunctionResult evaluated the arguments for a function-in-FROM in the query-lifespan memory context. This is insignificant in simple cases where the function relation is scanned only once; but if the function is in a sub-SELECT or is on the inside of a nested loop, any memory consumed during argument evaluation can add up quickly. (The potential for trouble here had been foreseen long ago, per existing comments; but we'd not previously seen a complaint from the field about it.) To fix, create an additional temporary context just for this purpose. Per an example from MauMau. Back-patch to all active branches. --- src/include/nodes/execnodes.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/include/nodes') diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 1344fc4adb6..c443112d806 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -1392,6 +1392,7 @@ typedef struct SubqueryScanState * tupdesc expected return tuple description * tuplestorestate private state of tuplestore.c * funcexpr state for function expression being evaluated + * argcontext memory context to evaluate function arguments in * ---------------- */ typedef struct FunctionScanState @@ -1401,6 +1402,7 @@ typedef struct FunctionScanState TupleDesc tupdesc; Tuplestorestate *tuplestorestate; ExprState *funcexpr; + MemoryContext argcontext; } FunctionScanState; /* ---------------- -- cgit v1.2.3