summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorAndres Freund2017-10-08 22:08:25 +0000
committerAndres Freund2017-10-08 22:08:25 +0000
commit84ad4b036d975ad1be0f52251bac3a06463c9811 (patch)
tree452e84ebb7d11ba87b6ad257fec34d1782aa0a34 /src/include
parent643c27e36ff38f40d256c2a05b51a14ae2b26077 (diff)
Reduce memory usage of targetlist SRFs.
Previously nodeProjectSet only released memory once per input tuple, rather than once per returned tuple. If the computation of an individual returned tuple requires a lot of memory, that can lead to problems. Instead change things so that the expression context can be reset once per output tuple, which requires a new memory context to store SRF arguments in. This is a longstanding issue, but was hard to fix before 9.6, due to the way tSRFs where evaluated. But it's fairly easy to fix now. We could backpatch this into 10, but given there've been fewc omplaints that doesn't seem worth the risk so far. Reported-By: Lucas Fairchild Author: Andres Freund, per discussion with Tom Lane Discussion: https://postgr.es/m/4514.1507318623@sss.pgh.pa.us
Diffstat (limited to 'src/include')
-rw-r--r--src/include/executor/executor.h1
-rw-r--r--src/include/nodes/execnodes.h1
2 files changed, 2 insertions, 0 deletions
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 770881849c..37fd6b2700 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -400,6 +400,7 @@ extern SetExprState *ExecInitFunctionResultSet(Expr *expr,
ExprContext *econtext, PlanState *parent);
extern Datum ExecMakeFunctionResultSet(SetExprState *fcache,
ExprContext *econtext,
+ MemoryContext argContext,
bool *isNull,
ExprDoneCond *isDone);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index c6d3021c85..c46113444f 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -946,6 +946,7 @@ typedef struct ProjectSetState
ExprDoneCond *elemdone; /* array of per-SRF is-done states */
int nelems; /* length of elemdone[] array */
bool pending_srf_tuples; /* still evaluating srfs in tlist? */
+ MemoryContext argcontext; /* context for SRF arguments */
} ProjectSetState;
/* ----------------