aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-08 13:08:36 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-08 13:08:36 -0500
commit8b39345a9d9abd1c371f8458301a227d0abb93b2 (patch)
tree9389c02fef1a75859cd5eb7b66f434075917922e
parentd50e3b1f8d763d51080ca4f6cbaa6818a6472292 (diff)
downloadpostgresql-8b39345a9d9abd1c371f8458301a227d0abb93b2.tar.gz
postgresql-8b39345a9d9abd1c371f8458301a227d0abb93b2.zip
In INSERT/UPDATE, use the table's real tuple descriptor as target.
This back-patches commit 20d3fe900 into the v12 and v13 branches. At the time I thought that commit was not fixing any observable bug, but Bertrand Drouvot showed otherwise: adding a dropped column to the previously-considered scenario crashes v12 and v13, unless the dropped column happens to be an integer. That is, of course, because the tupdesc we derive from the plan output tlist fails to describe the dropped column accurately, so that we'll do the wrong thing with a tuple in which that column isn't NULL. There is no bug in pre-v12 branches because they already did use the table's real tuple descriptor for any trigger-returned tuple. It seems that this set of bugs can be blamed on the changes that removed es_trig_tuple_slot, though I've not attempted to pin that down precisely. Although there's no code change needed in HEAD, update the test case to include a dropped column there too. Discussion: https://postgr.es/m/db5d97c8-f48a-51e2-7b08-b73d5434d425@amazon.com Discussion: https://postgr.es/m/16644-5da7ef98a7ac4545@postgresql.org
-rw-r--r--src/test/regress/expected/triggers.out50
-rw-r--r--src/test/regress/sql/triggers.sql13
2 files changed, 47 insertions, 16 deletions
diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out
index 027494bc76f..0f058d2d1e7 100644
--- a/src/test/regress/expected/triggers.out
+++ b/src/test/regress/expected/triggers.out
@@ -216,34 +216,56 @@ select * from trigtest;
drop table trigtest;
-- Check behavior with an implicit column default, too (bug #16644)
-create table trigtest (a integer);
+create table trigtest (
+ a integer,
+ b bool default true not null,
+ c text default 'xyzzy' not null);
create trigger trigger_return_old
before insert or delete or update on trigtest
for each row execute procedure trigger_return_old();
insert into trigtest values(1);
select * from trigtest;
- a
----
- 1
+ a | b | c
+---+---+-------
+ 1 | t | xyzzy
+(1 row)
+
+alter table trigtest add column d integer default 42 not null;
+select * from trigtest;
+ a | b | c | d
+---+---+-------+----
+ 1 | t | xyzzy | 42
+(1 row)
+
+update trigtest set a = 2 where a = 1 returning *;
+ a | b | c | d
+---+---+-------+----
+ 1 | t | xyzzy | 42
+(1 row)
+
+select * from trigtest;
+ a | b | c | d
+---+---+-------+----
+ 1 | t | xyzzy | 42
(1 row)
-alter table trigtest add column b integer default 42 not null;
+alter table trigtest drop column b;
select * from trigtest;
- a | b
----+----
- 1 | 42
+ a | c | d
+---+-------+----
+ 1 | xyzzy | 42
(1 row)
update trigtest set a = 2 where a = 1 returning *;
- a | b
----+----
- 1 | 42
+ a | c | d
+---+-------+----
+ 1 | xyzzy | 42
(1 row)
select * from trigtest;
- a | b
----+----
- 1 | 42
+ a | c | d
+---+-------+----
+ 1 | xyzzy | 42
(1 row)
drop table trigtest;
diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql
index 212b4f1f959..1d122af14ed 100644
--- a/src/test/regress/sql/triggers.sql
+++ b/src/test/regress/sql/triggers.sql
@@ -155,7 +155,10 @@ select * from trigtest;
drop table trigtest;
-- Check behavior with an implicit column default, too (bug #16644)
-create table trigtest (a integer);
+create table trigtest (
+ a integer,
+ b bool default true not null,
+ c text default 'xyzzy' not null);
create trigger trigger_return_old
before insert or delete or update on trigtest
@@ -164,7 +167,13 @@ create trigger trigger_return_old
insert into trigtest values(1);
select * from trigtest;
-alter table trigtest add column b integer default 42 not null;
+alter table trigtest add column d integer default 42 not null;
+
+select * from trigtest;
+update trigtest set a = 2 where a = 1 returning *;
+select * from trigtest;
+
+alter table trigtest drop column b;
select * from trigtest;
update trigtest set a = 2 where a = 1 returning *;