On Tue, Feb 5, 2019 at 4:29 PM Andres Freund <and...@anarazel.de> wrote:

> Hi,
>
> trigger.c goes through some trouble to free the tuples returned by
> trigger functions. There's plenty codepaths that look roughly like:
>                 if (oldtuple != newtuple && oldtuple != slottuple)
>                         heap_freetuple(oldtuple);
>                 if (newtuple == NULL)
>                 {
>                         if (trigtuple != fdw_trigtuple)
>                                 heap_freetuple(trigtuple);
>                         return NULL;            /* "do nothing" */
>                 }
>
> but we, as far as I can tell, do not reset the memory context in which
> the trigger functions have been called.
>
> Wouldn't it be better to reset an appropriate context after each
> invocation? Yes, that'd require some care to manage the lifetime of
> tuples returned by triggers, but that seems OK?
>

Currently the trigger functions are executed under per tuple memory
context, but the returned tuples are allocated from the executor memory
context in some scenarios.

   /*
    * Copy tuple to upper executor memory.  But if user just did
    * "return new" or "return old" without changing anything, there's
    * no need to copy; we can return the original tuple (which will
    * save a few cycles in trigger.c as well as here).
    */
   if (rettup != trigdata->tg_newtuple &&
    rettup != trigdata->tg_trigtuple)
    rettup = SPI_copytuple(rettup);

we need to take care of these also before switch to a context?

>
Regards,
Haribabu Kommi
Fujitsu Australia

Reply via email to