fast default vs triggers

From: Andrew Dunstan <andrew(dot)dunstan(at)2ndquadrant(dot)com>
To: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: fast default vs triggers
Date: 2018-09-18 19:36:32
Message-ID: 224e4807-395d-9fc5-2934-d5f85130f1f0@2ndQuadrant.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Tomas Vondra has pointed out to me that there's an issue with triggers
not getting expanded tuples for columns with fast defaults. Here is an
example that shows the issue:

andrew=# create table blurfl (id int);
CREATE TABLE
andrew=# insert into blurfl select x from generate_series(1,5) x;
INSERT 0 5
andrew=# alter table blurfl add column x int default 100;
ALTER TABLE
andrew=# create or replace function showmej() returns trigger
language plpgsql as $$ declare j json; begin j := to_json(old);
raise notice 'old x: %', j->>'x'; return new; end; $$;
CREATE FUNCTION
andrew=# create trigger show_x before update on blurfl for each row
execute procedure showmej();
CREATE TRIGGER
andrew=# update blurfl set id = id where id = 1;
NOTICE:  old x: <NULL>
UPDATE 1
andrew=# update blurfl set id = id where id = 1;
NOTICE:  old x: 100
UPDATE 1
andrew=#

The error is fixed with this patch:

diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2436692..f34a72a 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3396,7 +3396,11 @@ ltrmark:;
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
}

- result = heap_copytuple(&tuple);
+ if (HeapTupleHeaderGetNatts(tuple.t_data) < relation->rd_att->natts)
+ result = heap_expand_tuple(&tuple, relation->rd_att);
+ else
+ result = heap_copytuple(&tuple);
+
ReleaseBuffer(buffer);

return result;

I'm going to re-check the various places that this might have been
missed. I guess it belongs on the open items list.

cheers

andrew

--
Andrew Dunstan https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Thomas Munro 2018-09-18 20:34:36 Re: Collation versioning
Previous Message Fabien COELHO 2018-09-18 19:07:34 Re: pgbench - add pseudo-random permutation function