Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wC6aY-001fVk-1E for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Apr 2026 01:59:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wC6aW-00456E-1G for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Apr 2026 01:59:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wC6aW-004566-0L for pgsql-hackers@lists.postgresql.org; Mon, 13 Apr 2026 01:59:45 +0000 Received: from mail-vs1-xe35.google.com ([2607:f8b0:4864:20::e35]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wC6aU-00000000lGF-3z9X for pgsql-hackers@lists.postgresql.org; Mon, 13 Apr 2026 01:59:44 +0000 Received: by mail-vs1-xe35.google.com with SMTP id ada2fe7eead31-604dfcc9892so2486098137.1 for ; Sun, 12 Apr 2026 18:59:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776045581; cv=none; d=google.com; s=arc-20240605; b=fAa8YDXgoe7UqOlOODNOO88P9S8hObO5L3ip4byakIU1nzjDHDKQNyDrkbG21G1EgW gZsKmCvywBQyI58r0pIfSzsAxoOiI6xeNooy6XIsYCxojo54w5dpRVKlIInuEFL2IZzb kdJEGDsjwdt95FDpWetEO4FxqdUu94XU5hmxF2Lszn64exGAIHcJr1o5WdVFBolHPKgA VKx7uJrUDcrCCst9VrsWsqrkMfuvF61hdphkxyLjEYSKptoA0Ow6fRVjUC9ubYHwUZH4 VuNV8AOvtR9b7UzYqFagdzOko3oYa8kkP2PbdcqabPaOoACiT/C+0q77e2JLeRLFttdK PZzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=HaZbOp0b6ZhvePwk73FPHKkCr0MEgdAG1vl7eLol+qU=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=DLPfwb4KpZnk2mUxBkhuTg/IN8uhpaaoTzhW5sdnKJpFGDDmRVqeEgNhmfpT5QYw3A v7lQaeQkqD1rRU+AoRNJGzNbkncav1uQGPbw0/KD6ePDCdowkViFOr1wYqS7er2lMsWj t1oabHkedeEDpy9mTk5SCnDDE1odK9fR1yRbivelRqpPKGXT3L1DntDZFC94vQ6BhUM+ E1uMEa17cqF5/0P22/gM0mbJPXiJFKJBM6t16QKTVGjps4rTlS33qb68nsvruGVTrMdQ sQo03/BeSWRnXXsPYhiB3z8fMSh9rUsMj0TxPd7IuIj9zgFzAKCTv8MWeW11Xb6WeRKC GgGw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776045581; x=1776650381; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=HaZbOp0b6ZhvePwk73FPHKkCr0MEgdAG1vl7eLol+qU=; b=TyYbp2gqg0775qbLQF5N9KlS+FVRYU5OlW7r80fOk+v94rVsnT3bLWrBkjT76dzA1x MX91Icdu4RcMQqyzHHmEGnBHJPe0J5VzsJ8hfReABi5DG+WDtHZdNN+Bi8+dH7t+HaZA G8pSgULHpqswX8Ocy33u0T2QBKrZPyn3j914OMogWis7d06dpGk5D7FBlh+Om35OlGFi 1C1QUMLPDUpfNLtAIuTnixZVY0zu6BG8BOi5Gp8Mb0PXp7wIG8jUpx3KpxcyDwZELKgT 20vNDzmRewB0MMTQyKYNvvaWymdkYCCnzRCwunUcEZgIy+s0zrlZBaGUk7nArZ3nAdIW iF0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776045581; x=1776650381; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HaZbOp0b6ZhvePwk73FPHKkCr0MEgdAG1vl7eLol+qU=; b=r3vyyzkxbHQ7yJUmyyGtfwQCOBwzeNDMfNuLRRnhtYoMW2Llc/iMkyVFHI7+0In0b3 rBdgysT0tWr+XDgbmnYllUHbekdpuylVZBKarDYXdB1O54FBUcrUf2RCNFCXZ+oSVqqv d5P32XYCRvJ/FXq5TrPh/Z7vsKiLetVDXD29J7sjaXsAei3C1YXqc0L8Um7kPGy8olSF NW8Pg2W9ztxOenET6fFD9Wk+NoNJgJm6/L67En5mcK6KIce5yPxasuKzymljNsaPS8QS tLpWIX/BRN4AOYCYsHlfBomTcQaaXnZ/OGVbcXrwMmy6iz4hK8EwBIEk7MdwgqJVYKp+ irVA== X-Gm-Message-State: AOJu0Yxspnn3qvR6VVJa/yD6XVgofrSGJTIEEc6dTjgVIa0j5gpUqTCY IpmVvy1/tbYpA6CL+gI+DdsBFRzrqaMz13Xd01Xj3xbwZrnGdPhHwBNhoVtt+aTgkBflahy207i iRnpU29oGhol7YFxIssDksoyRTat2bTMYoDYx X-Gm-Gg: AeBDietR+f8NqINJrc2ZetFwDzKotyFNn+CgDbdEMgcE0cP7v1RvtRqj8fzFQ8gUeJg UmDzdgQj/Jlrcmr9IyngE/2H9J9Gl4Yaut4CVZzvdbskR49lh9wAmoLRK95EhRYv9j4nXvfo568 uAL0Cfo4DTm/Nc+YA3pK2gQscVetGfYTn5VoSDddZeyMGMPyfrCv/sPWfkDRIfPOJMa7lKrP2a+ I5qW7wQ9OTjwyL0rQ9tGAW8Dnjl5KHkrd60EpC3fLLf4jFySQAFP3YIOs76G6pdNQsa4K2SWApB m1pE1hG99DFxIxMajw== X-Received: by 2002:a05:6102:291e:b0:602:b037:4de8 with SMTP id ada2fe7eead31-609fe8a45fbmr4772426137.4.1776045580761; Sun, 12 Apr 2026 18:59:40 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Sun, 12 Apr 2026 18:59:28 -0700 X-Gm-Features: AQROBzABX84NXIo8leIg9RdpRE3N9sKBnVL7sZz81PsEeGRabkM4075zomf0i9M Message-ID: Subject: Bug: Rule actions see wrong values for generated columns (NEW.gen reads OLD value) To: PostgreSQL Hackers Content-Type: multipart/alternative; boundary="000000000000f23f87064f4dd59b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f23f87064f4dd59b Content-Type: text/plain; charset="UTF-8" Hi hackers, NEW. is resolved to the OLD row's value for update or NULL for insert cases in a DO ALSO rule action for generated columns. This bug affects both stored and virtual generated columns. Reporting here to see if this is a known issue with generated columns. Repro: CREATE TABLE t (id int PRIMARY KEY, a int, gen int GENERATED ALWAYS AS (a * 2) VIRTUAL); CREATE TABLE t_log (op text, old_gen int, new_gen int); CREATE RULE t_log AS ON UPDATE TO t DO ALSO INSERT INTO t_log VALUES ('UPD', OLD.gen, NEW.gen); INSERT INTO t (id, a) VALUES (1, 5); UPDATE t SET a = 100 WHERE id = 1; postgres=# SELECT * FROM t; id | a | gen ----+-----+----- 1 | 100 | 200 (1 row) postgres=# SELECT * FROM t_log; op | old_gen | new_gen -----+---------+--------- UPD | 10 | 10 (1 row) Thanks, Satya --000000000000f23f87064f4dd59b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

NEW.<generated_coulmn> is resolve= d to the OLD row's value
for update or NULL for insert cases in a D= O ALSO rule action for
generated columns.=C2=A0 This bug affects = both stored and virtual=C2=A0
generated columns. Reporting here t= o see if this is a known issue
with generated columns.
<= div>
Repro:

CREATE TABLE t (id int P= RIMARY KEY, a int,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 gen int GENERATED ALWAYS AS (a * 2) VIRTUAL);
CREATE TABLE t_log (op= text, old_gen int, new_gen int);

CREATE RULE t_log AS ON UPDATE TO = t
=C2=A0 DO ALSO INSERT INTO t_log VALUES ('UPD', OLD.gen, NEW.g= en);

INSERT INTO t (id, a) VALUES (1, 5);=C2=A0
UPDATE t SET a = =3D 100 WHERE id =3D 1;=C2=A0

postgres=3D# SELECT = * FROM t;
=C2=A0id | =C2=A0a =C2=A0| gen
----+-----+-----
=C2=A0 = 1 | 100 | 200
(1 row)

postgres=3D# SELECT * FROM t_log;
=C2=A0= op =C2=A0| old_gen | new_gen
-----+---------+---------
=C2=A0UPD | = =C2=A0 =C2=A0 =C2=A010 | =C2=A0 =C2=A0 =C2=A010
(1 row)

Thanks,
Satya
--000000000000f23f87064f4dd59b--