Re: BUG #15900: `executor could not find named tuplestore` in triggers with transition table and row locks

Alex Aktsipetrov <alex.akts@gmail.com>

From: Александр Акципетров <alex.akts@gmail.com>
To: Александр Акципетров <alex.akts@gmail.com>, pgsql-bugs@lists.postgresql.org
Date: 2019-07-08T23:32:55Z
Lists: pgsql-bugs
On Tue, 9 Jul 2019 at 01:22, PG Bug reporting form <noreply@postgresql.org>
wrote:

> The following bug has been logged on the website:
>
> Bug reference:      15900
> Logged by:          Alex Aktsipetrov
> Email address:      alex.akts@gmail.com
> PostgreSQL version: 12beta2
> Operating system:   Ubuntu 16.04
> Description:
>
> SELECT FOR UPDATE query that references a transition table in AFTER
> INSERT/UPDATE triggers produces an unexpected error. The same query with
> FOR
> UPDATE omitted finishes without any error, which is my expectation for the
> original one as well. AFTER DELETE triggers were not tested.
>
> For example, the following query:
>
>         create table testtr (a int, b text);
>
>         create function testtr_trigger() returns trigger language plpgsql
> as
>         $$begin
>          perform(
>            select array_agg(a) from
>            (select testtr.a from testtr join new_table on testtr.a =
> new_table.a
> for update)
>            as tmp
>          );
>          return new;
>         end$$;
>
>         create trigger testtr_trigger
>         after insert on testtr
>         referencing new table as new_table
>         for each statement execute procedure testtr_trigger();
>
>         insert into testtr values (1, 'one'), (2, 'two');
>
> produces the following error:
>
>         ERROR:  executor could not find named tuplestore "new_table"
>         CONTEXT:  SQL statement "SELECT (
>            select array_agg(a) from
>            (select testtr.a from testtr join new_table on testtr.a =
> new_table.a
> for update)
>            as tmp
>         )"
>
> I think the issue was introduced in
> ad0bda5d24ea2bcc72b5e50020e3c79bab10836b
> as the query finishes successfully in its ancestor.
>
>

Commits

  1. Pass QueryEnvironment down to EvalPlanQual's EState.

  2. Store tuples for EvalPlanQual in slots, rather than as HeapTuples.