Hi, reporting a basic bug which involves a RETURNING clause on DML with parenthesized OLD/NEW.
Effectively, the (parenthesized) row reference isn't being honored, and instead the default behavior is applied.
Seeing this on tip of master as well (19beta1).
postgres=# create table t(a int, b text); CREATE TABLE postgres=# insert into t values (1, 'one') returning (old).b, old.b, (new).b, new.b; b | b | b | b -----+---+-----+----- one | | one | one (1 row)
INSERT 0 1 postgres=# update t set b = '1' where a = 1 returning (old).b, old.b, (new).b, new.b; b | b | b | b ---+-----+---+--- 1 | one | 1 | 1 (1 row)
UPDATE 1 postgres=# delete from t where a = 1 returning (old).b, old.b, (new).b, new.b; b | b | b | b ---+---+---+--- 1 | 1 | 1 | (1 row)
DELETE 1 postgres=# select version(); version -------------------------------------------------------------------------------------------------------------------- PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit (1 row)