]> granicus.if.org Git - postgresql/commitdiff
Plug leak in BuildTupleHashTable by creating ExprContext in correct context.
authorAndres Freund <andres@anarazel.de>
Sat, 9 Feb 2019 08:35:57 +0000 (00:35 -0800)
committerAndres Freund <andres@anarazel.de>
Sat, 9 Feb 2019 09:05:49 +0000 (01:05 -0800)
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

src/backend/executor/execGrouping.c

index 4e7600e4ed6074e780d95030c63e2407195a7cc0..7cf001518a14cf6cc2b720f18c2b240553ffd7a0 100644 (file)
@@ -212,11 +212,17 @@ BuildTupleHashTable(PlanState *parent,
                                                                                                        &TTSOpsMinimalTuple, &TTSOpsMinimalTuple,
                                                                                                        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;
 }