Re: Potentially undocumented behaviour change in Postgres 11 concerning OLD record in an after insert trigger

From: Kristjan Tammekivi <kristjantammekivi(at)gmail(dot)com>
To: Charles Clavadetscher <clavadetscher(at)swisspug(dot)org>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Potentially undocumented behaviour change in Postgres 11 concerning OLD record in an after insert trigger
Date: 2019-01-04 12:20:55
Message-ID: CAABK7uL8nPMd3KiLN8cC=tt3CUEvN9g_=f8NmytJfP9GVLQ+qQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

Hi,
I've read the documentation, that's why I said this might be undocumented.
Try the SQL in Postgres 11 and see that it works for yourself.
I have an analogous trigger in production from yesterday and I've tested it
in local environment as well.

On Fri, Jan 4, 2019 at 12:56 PM Charles Clavadetscher <
clavadetscher(at)swisspug(dot)org> wrote:

> Hello
>
>
>
> *From:* Kristjan Tammekivi <kristjantammekivi(at)gmail(dot)com>
> *Sent:* Freitag, 4. Januar 2019 11:46
> *To:* pgsql-general(at)postgresql(dot)org
> *Subject:* Potentially undocumented behaviour change in Postgres 11
> concerning OLD record in an after insert trigger
>
>
>
> Hi,
>
>
>
> I've noticed a change in the behaviour in triggers / hstores in Postgres
> 11.1 when compared to Postgres 10.5.
>
> The following won't work on Postgres 10.5 but in Postgres 11.1 it works
> just fine:
>
>
>
> CREATE EXTENSION hstore;
>
> CREATE TABLE _tmp_test1 (id serial PRIMARY KEY, val INTEGER);
> CREATE TABLE _tmp_test1_changes (id INTEGER, changes HSTORE);
>
> CREATE FUNCTION test1_trigger ()
> RETURNS TRIGGER
> LANGUAGE plpgsql
> AS
> $BODY$
> BEGIN
> INSERT INTO _tmp_test1_changes (id, changes) VALUES (NEW.id, hstore(OLD) -
> hstore(NEW));
> RETURN NEW;
> END
> $BODY$;
>
> CREATE TRIGGER table_update AFTER INSERT OR UPDATE ON _tmp_test1
> FOR EACH ROW EXECUTE PROCEDURE test1_trigger();
>
>
>
> INSERT INTO _tmp_test1 (val) VALUES (5);
>
> ERROR: record "old" is not assigned yet
>
> DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
>
> CONTEXT: SQL statement "INSERT INTO _tmp_test1_changes (id, changes)
> VALUES (NEW.id, hstore(OLD) - hstore(NEW))"
>
> PL/pgSQL function test1_trigger() line 3 at SQL statement
>
>
>
> I couldn't find anything about this in the release notes (
> https://www.postgresql.org/docs/11/release-11.html), but maybe I just
> didn't know what to look for.
>
>
>
> *I doubt that this works on any PG version for INSERT.*
>
>
>
> *According to the documentation:*
>
>
>
> *https://www.postgresql.org/docs/10/plpgsql-trigger.html
> <https://www.postgresql.org/docs/10/plpgsql-trigger.html> and
> https://www.postgresql.org/docs/11/plpgsql-trigger.html
> <https://www.postgresql.org/docs/11/plpgsql-trigger.html>*
>
>
>
> *OLD: **Data type **RECORD**; variable holding the old database row for *
> *UPDATE**/**DELETE** operations in row-level triggers. This variable is
> unassigned in statement-level triggers and for **INSERT** operations.*
>
>
>
> *Regards*
>
> *Charles*
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Thomas Güttler 2019-01-04 13:15:56 Re: Use bytearray for blobs or not?
Previous Message Achilleas Mantzios 2019-01-04 11:48:13 Re: Use bytearray for blobs or not?

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2019-01-04 12:34:44 Re: pg_dump multi VALUES INSERT
Previous Message Peter Eisentraut 2019-01-04 12:20:09 Re: Log a sample of transactions