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 1wF7lv-004lab-0f for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Apr 2026 09:51:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wF7lu-007yCz-1V for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Apr 2026 09:51:58 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wF7lu-007yCr-0C for pgsql-hackers@lists.postgresql.org; Tue, 21 Apr 2026 09:51:58 +0000 Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wF7lr-0000000245z-1Jy7 for pgsql-hackers@lists.postgresql.org; Tue, 21 Apr 2026 09:51:57 +0000 Received: by mail-vk1-xa2c.google.com with SMTP id 71dfb90a1353d-56a857578a8so1514701e0c.3 for ; Tue, 21 Apr 2026 02:51:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776765115; cv=none; d=google.com; s=arc-20240605; b=HNNPLq7uKp2b+6V07wPZtp6/h0uA6Ihy0Yd2sOMTOOMNuVw7WmOJqsKjK2Mbn45xQJ wKetZjxa4UbWHwLF7AHW0oWHsZ8KIFn8bCAP2KzARk72e3p8CgiWpFSWR1dLEdcvuTzK w31FMnFcKGDT4Ymvddc4VA3Cpjgn1FHgkNkJRvJnk2uH3FejdG6xq1flQtViZ8j2HX0b 3RoYM+3dauRRGweUZcVavY2h50ilG69ODu+MTUR4cCwr17OSRCvLH6XyUo3QpzCx0Pe7 RE2HvopvO2vQ1uTspjE0BxQlga4QpsfOFSE++HIs9J6bfm4mgs+u5gabq0JHM3jBOHIr 23iQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=Slurn4oI6dmNulfviG9N8juXqduN97AH6WzP181j3AA=; fh=47WaTdB/ygO3Cs+JXBdh92kc2d8E2e2QBg+brgc0OEY=; b=cd/Kc+WlR77YQV6Q5BSHHkTetUnuZzpdYG08I2LRVyDuxeoAWpbO8cVHgflPOtcgCy wzjBEh3erGAL98v8Ps6GEjEAs+09ChyNGNMmvf14k+u1LZxV0VvT84UfhQfhjVSWfB0e kxI3zvwvdP5cyb4xv6Lhm+zTPotI3mnSjZ9IQMEFgVXkdJ7EXuVZ1UNvzpUYGl5njytW ZwFvhikeNj+11Ei9RHkjrnO2m/I/mobISiezdTxNJ0THy4uaja0BLcScyr5FubwlvzTn Gw8gwFy9/y42/5Kk2IwJ94smpcsD8JjNHYUaVA4tRptCS48x2qAZxebfiDGRqqrBVxar 6EsQ==; 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=1776765115; x=1777369915; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=Slurn4oI6dmNulfviG9N8juXqduN97AH6WzP181j3AA=; b=UG4H40O9rLkZhLMVZFa0T7Bqhc1iVvNOJYLbFXNKG2rU9liCkNkalA4UU4X+acFCKw nPwQJp4a/bfw6yQ1QvJIeR6YqFue5au/nG/JPXNfoeoEHq5CXDJxvWxspvAjUKeSJUJh nrFdtl9KpNpeQccLC5sLQrxJNKXdn5RPUBxOgEdPzgHJfVRkOGdntVwCSoFTB/dO8N/R hUvEfs4WAI5fs9rWdp5PY6NllqzRCh5cS1MCfvjxOcHWicT2cbSc29NJXEtAfxvGfmmS 5FZubYKUNkVu/q466w4FdWUHfji5y74UmhmAvTVTHvXa9U8fgOmOSe0xfxu7faG3h1ov w0OQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776765115; x=1777369915; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Slurn4oI6dmNulfviG9N8juXqduN97AH6WzP181j3AA=; b=rfNEpUYNYIw3Tm+BwpasGBSGfKMd9KdRRQ+IqOf1xmavjVFUGt4NNhVzBKKGXb432g 2UlcyRBZKxVVmKdaVH0SftxFpQ4CHRyQdM+7dIc0210uxtchqpHnQT1Vl9ljDexHedA2 a7MPhH8gR9Ffk9uhSF0IJk6A8IsGOt//dK3rtWqZPDvwbeAMPAFvp8ljmnAkPeFnldiH rorAu9DBPhQWXOEfCD5Yp4wNscuNyJT1vDnQJYryVbeVVQCftjz/lJrvNxauuJMY0Zzm RdnLHKIUkga7u4jVdE/KIXH/APDGjLF72m63EvxH2iQBUTEnCivRzu4AfS4CIJahCWcA uuAw== X-Forwarded-Encrypted: i=1; AFNElJ+8Os2oHXV39giy12epdQaV5/2QStlxY5HHPXKG5qJNSkVN6teOuXz0ZB7Q1f9HUtlahRGZ+p6WMyHHursg@lists.postgresql.org X-Gm-Message-State: AOJu0Yx/xu64icOmbIF9PDFlEG0AnW6N+SYtPUJtN34izk/cBk1ceXFZ 6Oy+dVS2554iMmuWWzynRUFo0j7uwvJwwqEpBaj1jr75NCAr5GwnX3sWqNkrLAGybDQewJJe+ub IM9vOirSD3Ixxi9frlHXVpjuTAcKHKgo= X-Gm-Gg: AeBDieuUx8lAGyTLTmkxaoFaGCgXiLA034IoUvTGrCInGfdFNN/8XV/NYzhx+Usv+HC khNVTbkVOkSYucFVvOXvjdV8RKGkhoBRUBfwSy3G2eynOtC27QfK9JEURvjt+g3vs9ATzUyZ+rX C/4/bszmc1LilWn9i8LanDC9k50SOZ8nPvh1SXARtStEcFUsDnAA7oKiZkjuleYQKDdjWQt0cXT QBGLaCIjI0LDLD996ninJKyxVjSvB0DhBa2kKGgNAfbOEiypu6Zhkjf0xMt9tT/ny0JTMJTwhON Q6s1ffmhiWDy5yvAN5EJ6E7WOZgMP7zUYePbtgYaFS2rTq4ji78JIksWOZmlvUNYeZypNdsyTD9 nP9m2UAqKRWQpQwtMlXBQOCzSE7ZI7WlXbXnmBI7VzmBqBDyjj8WEAw/k8Kdo19ByETxnRz+M5p ZbQ/zlrwG3j8Encgc3ia7gJxWtXF1RL0SH X-Received: by 2002:a05:6122:288b:b0:56e:e9cf:710e with SMTP id 71dfb90a1353d-56fa57d832amr6979815e0c.3.1776765114847; Tue, 21 Apr 2026 02:51:54 -0700 (PDT) MIME-Version: 1.0 References: <85ac7f0e-d95f-4377-ade0-8941fd328012@eisentraut.org> <7d63ddfa-c735-4dfe-8c7a-4f1e2a621058@eisentraut.org> <4606deaa-7d65-4f22-8a78-356c3180be9d@eisentraut.org> <53f1c094-3c29-4ef6-a9bd-dc2e7894ceb0@eisentraut.org> In-Reply-To: From: jian he Date: Tue, 21 Apr 2026 17:51:18 +0800 X-Gm-Features: AQROBzCpRmOz_-VhCeuZpRvXyRT9NDeWNcpOK4-DoC8Yw3PIYVR9qBg0qjXgPRk Message-ID: Subject: Re: SQL:2011 Application Time Update & Delete To: Paul A Jungwirth Cc: SATYANARAYANA NARLAPURAM , Peter Eisentraut , Chao Li , PostgreSQL Hackers Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Sun, Apr 19, 2026 at 7:18=E2=80=AFAM Paul A Jungwirth wrote: > > Here is a patch that forbids changing the valid_at column in a BEFORE > trigger. It works by capturing the value before triggers run, then > checking afterwards if it is still the same (using the default btree > equality operator; probably a simple binary comparison is good > enough). > > This copy+check only happens if the table has BEFORE UPDATE row > triggers, so there is no cost in most cases. > > I'm raising ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION, which is what we > use when (basically) a trigger & UPDATE both change a row in a way > that leaves the user intent unclear. I think that's a very close fit > here, but you could argue we should use the same errcode as SETing > valid_at. That is ERRCODE_SYNTAX_ERROR. That strikes me as a > questionable choice, actually. Personally I think using different > errcodes is correct though. > HI. After applying v1-0001-Forbid-BEFORE-UPDATE-triggers-changing-the-FOR-PO.pa= tch ---------------------------------------------------- CREATE OR REPLACE FUNCTION trg_fponum() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN NEW.valid_at =3D '[1,12)'; raise notice 'old: %, new: %', old, new; RETURN NEW; END; $$; create table fpo3(valid_at int4range, b int); CREATE TRIGGER fpo_before_update_row BEFORE UPDATE ON fpo3 FOR EACH ROW EXECUTE PROCEDURE trg_fponum(); insert into fpo3 values('[1,100]', 1); UPDATE fpo3 FOR PORTION OF valid_at FROM 1 TO 12 SET b =3D 2; ---------------------------------------------------- The above works as expected, but the below is not what i expected. create type textrange as range (subtype =3D text, collation =3D "C"); CREATE OR REPLACE FUNCTION trg_fpo() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN NEW.valid_at =3D '[A,d)'; raise notice 'old: %, new: %', old, new; RETURN NEW; END; $$; create table fpo1(valid_at textrange, b int); CREATE TRIGGER fpo_before_update_row BEFORE UPDATE ON fpo1 FOR EACH ROW EXECUTE PROCEDURE trg_fpo(); insert into fpo1 values ('[a,d]', 1); UPDATE fpo1 FOR PORTION OF valid_at FROM 'A' TO 'd' SET b =3D 2; NOTICE: old: ("[a,d]",1), new: ("[A,d)",2) ERROR: cannot change column "valid_at" from a BEFORE trigger because it is used in FOR PORTION OF Should I expect this to work without error, just like the table fpo3 UPDATE FOR PORTION OF statement above? -- jian https://www.enterprisedb.com/