Re: Potentially undocumented behaviour change in Postgres 11concerning OLD record in an after insert trigger - Mailing list pgsql-general

From Kristjan Tammekivi
Subject Re: Potentially undocumented behaviour change in Postgres 11concerning OLD record in an after insert trigger
Date
Msg-id CAABK7uL8nPMd3KiLN8cC=tt3CUEvN9g_=f8NmytJfP9GVLQ+qQ@mail.gmail.com
Whole thread Raw
In response to RE: Potentially undocumented behaviour change in Postgres 11 concerning OLD record in an after insert trigger  ("Charles Clavadetscher" <clavadetscher@swisspug.org>)
Responses Re: Potentially undocumented behaviour change in Postgres 11concerning OLD record in an after insert trigger
List pgsql-general
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@swisspug.org> wrote:

Hello

 

From: Kristjan Tammekivi <kristjantammekivi@gmail.com>
Sent: Freitag, 4. Januar 2019 11:46
To: pgsql-general@postgresql.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 and 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

pgsql-general by date:

Previous
From: Achilleas Mantzios
Date:
Subject: Re: Use bytearray for blobs or not?
Next
From: Thomas Güttler
Date:
Subject: Re: Use bytearray for blobs or not?