aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execUtils.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-07-25 16:31:49 -0700
committerAndres Freund <andres@anarazel.de>2018-07-25 16:31:49 -0700
commit3acc4acd9bcbefbfaf789762950726c6208daf1b (patch)
treea4b666f398bbba09f38de16d06f45c3acebbd532 /src/backend/executor/execUtils.c
parentbcafa263ec408ae8e383e389832b2a623900a55c (diff)
downloadpostgresql-3acc4acd9bcbefbfaf789762950726c6208daf1b.tar.gz
postgresql-3acc4acd9bcbefbfaf789762950726c6208daf1b.zip
LLVMJIT: Release JIT context after running ExprContext shutdown callbacks.
Due to inlining it previously was possible that an ExprContext's shutdown callback pointed to a JITed function. As the JIT context previously was shut down before the shutdown callbacks were called, that could lead to segfaults. Fix the ordering. Reported-By: Dmitry Dolgov Author: Andres Freund Discussion: https://postgr.es/m/CA+q6zcWO7CeAJtHBxgcHn_hj+PenM=tvG0RJ93X1uEJ86+76Ug@mail.gmail.com Backpatch: 11-, where JIT compilation was added
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r--src/backend/executor/execUtils.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index b963cae730c..5b3eaec80bc 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -45,6 +45,7 @@
#include "access/relscan.h"
#include "access/transam.h"
#include "executor/executor.h"
+#include "jit/jit.h"
#include "mb/pg_wchar.h"
#include "nodes/nodeFuncs.h"
#include "parser/parsetree.h"
@@ -174,11 +175,11 @@ CreateExecutorState(void)
*
* Release an EState along with all remaining working storage.
*
- * Note: this is not responsible for releasing non-memory resources,
- * such as open relations or buffer pins. But it will shut down any
- * still-active ExprContexts within the EState. That is sufficient
- * cleanup for situations where the EState has only been used for expression
- * evaluation, and not to run a complete Plan.
+ * Note: this is not responsible for releasing non-memory resources, such as
+ * open relations or buffer pins. But it will shut down any still-active
+ * ExprContexts within the EState and deallocate associated JITed expressions.
+ * That is sufficient cleanup for situations where the EState has only been
+ * used for expression evaluation, and not to run a complete Plan.
*
* This can be called in any memory context ... so long as it's not one
* of the ones to be freed.
@@ -204,6 +205,13 @@ FreeExecutorState(EState *estate)
/* FreeExprContext removed the list link for us */
}
+ /* release JIT context, if allocated */
+ if (estate->es_jit)
+ {
+ jit_release_context(estate->es_jit);
+ estate->es_jit = NULL;
+ }
+
/*
* Free the per-query memory context, thereby releasing all working
* memory, including the EState node itself.