aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2019-02-09 00:35:57 -0800
committerAndres Freund <andres@anarazel.de>2019-02-09 01:05:50 -0800
commit9cf37a527cf83e94f8f166d380baf53287a0337b (patch)
treef94be8908fbf066a6eaf6ebedd03fe6da62b4f3c /src
parent5996cfc4665735a7e6e8d473bd66e8b11e320bbb (diff)
downloadpostgresql-9cf37a527cf83e94f8f166d380baf53287a0337b.tar.gz
postgresql-9cf37a527cf83e94f8f166d380baf53287a0337b.zip
Plug leak in BuildTupleHashTable by creating ExprContext in correct context.
In bf6c614a2f2c5 I added a expr context to evaluate the grouping expression. Unfortunately the code I added initialized them while in the calling context, rather the table context. Additionally, I used CreateExprContext() rather than CreateStandaloneExprContext(), which creates the econtext in the estate's query context. Fix that by using CreateStandaloneExprContext when in the table's tablecxt. As we rely on the memory being freed by a memory context reset that means that the econtext's shutdown callbacks aren't being called, but that seems ok as the expressions are tightly controlled due to ExecBuildGroupingEqual(). Bug: #15592 Reported-By: Dmitry Marakasov Author: Andres Freund Discussion: https://postgr.es/m/20190114222838.h6r3fuyxjxkykf6t@alap3.anarazel.de Backpatch: 11, where I broke this in bf6c614a2f2c5
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execGrouping.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c
index c4d0e040587..271bba17e40 100644
--- a/src/backend/executor/execGrouping.c
+++ b/src/backend/executor/execGrouping.c
@@ -208,11 +208,17 @@ BuildTupleHashTable(PlanState *parent,
hashtable->tab_eq_func = ExecBuildGroupingEqual(inputDesc, inputDesc,
numCols,
keyColIdx, eqfuncoids,
- parent);
+ NULL);
- MemoryContextSwitchTo(oldcontext);
+ /*
+ * While not pretty, it's ok to not shut down this context, but instead
+ * rely on the containing memory context being reset, as
+ * ExecBuildGroupingEqual() only builds a very simple expression calling
+ * functions (i.e. nothing that'd employ RegisterExprContextCallback()).
+ */
+ hashtable->exprcontext = CreateStandaloneExprContext();
- hashtable->exprcontext = CreateExprContext(parent->state);
+ MemoryContextSwitchTo(oldcontext);
return hashtable;
}