Re: BUG #17827: Rule on insert into table doesn't work when excepting select from the table itself - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #17827: Rule on insert into table doesn't work when excepting select from the table itself
Date
Msg-id 377748.1678374108@sss.pgh.pa.us
Whole thread Raw
In response to BUG #17827: Rule on insert into table doesn't work when excepting select from the table itself  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #17827: Rule on insert into table doesn't work when excepting select from the table itself
List pgsql-bugs
PG Bug reporting form <noreply@postgresql.org> writes:
> create table tbl (id int);
> create table rule_stat (msg text, id int);
> create rule rule_tbl as on insert to tbl do insert into rule_stat
> values('Rule triggered for ',new.id);

> insert into tbl 
> select 1
> except
> select id from tbl;

> table rule_stat; -- no rows

This is not a bug.  The DO ALSO command executes after the original
INSERT command, and what it executes looks basically like

insert into rule_stat
select 'Rule triggered for ', id from
(select 1
 except
 select id from tbl);

But at this point we've already completed the original INSERT,
so now there is a row with id 1 in "tbl", and thus the EXCEPT
produces nothing.

While there are use-cases for this sort of behavior, most people
find that propagating data to another table is better done with
an AFTER trigger.  It's far easier to understand what will happen.

            regards, tom lane



pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: PostgreSQL 14.7 "ALTER TABLE IF EXISTS" fails - ERROR: schema/relation "" does not exist
Next
From: "Salavessa, Joao (Senior Developer)"
Date:
Subject: RE: [EXTERNAL] Re: PostgreSQL 14.7 "ALTER TABLE IF EXISTS" fails - ERROR: schema/relation "" does not exist