Potentially undocumented behaviour change in Postgres 11 concerning OLD record in an after insert trigger
Kristjan Tammekivi <kristjantammekivi@gmail.com>
From: Kristjan Tammekivi <kristjantammekivi@gmail.com>
To: pgsql-general@postgresql.org
Date: 2019-01-04T10:45:42Z
Lists: pgsql-hackers, pgsql-general
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.
Commits
-
Update docs & tests to reflect that unassigned OLD/NEW are now NULL.
- 59029b6fb71e 12.0 landed
- 312d21d86350 11.2 landed