On 2018-07-25 18:11:13 -0400, Alvaro Herrera wrote:
> On 2018-Jul-25, Andres Freund wrote:
>
> > The fix is easy, releasing the JIT context should just happen in
> > FreeExecutorState(). Only thing is that that function has the following
> > comment in the header:
> > * 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.
> >
> > I don't really think throwing away functions is a violation of that, but
> > I think it's possible to argue the other way?
>
> I suppose the other possible way about it is to say estate->es_jit in a
> local variable so that you can call it after FreeExecutorState.
That doesn't work, as the object pointed to by estate->es_jit is also
allocated inside the context that estate->es_jit deletes.
> But what would be the advantage of avoiding the context release inside
> FreeExecutorState? It seems pretty appropriate to me to do it there.
> You could argue that the JIT context is definitely part of the estate
> being freed. Just amend the comment, no?
I agree it's right to do it there. I think I'm more questioning whether
there's even a need to adapt the comment, given it's really a local
memory resource. But I guess I'll just add a 'and ...' after
"ExprContexts within the EState".
Greetings,
Andres Freund