PostgreSQL Rule does not work with deferred constraint.

From: Louis Tian <louis(dot)tian(at)aquamonix(dot)com(dot)au>
To: "pgsql-general(at)lists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: PostgreSQL Rule does not work with deferred constraint.
Date: 2022-09-21 01:19:15
Message-ID: SY4P282MB1052134AB3D38592D4BB7A0BA64F9@SY4P282MB1052.AUSP282.PROD.OUTLOOK.COM
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi all,

Encountered a possible bug today. In short, it appears that the rule system is not deferring the constraint checking as specified. Here is an example.
create table "parent" (
"id" uuid primary key
);

create table "children" (
  "id" uuid primary key
      default gen_random_uuid()
       references parent("id")
            deferrable
            initially deferred
);

-- this works as expected.
begin;
      insert into "children" values ('74c247be-2fc3-43e5-94f8-d5e1af147a9b');
      insert into "parent" values ('74c247be-2fc3-43e5-94f8-d5e1af147a9b');
commit;

-- doing the same with a rule
create rule on_insert as on insert to "children" do also (
      insert into "parent" (id) values (new."id");
);

-- this fails with:
--    ERROR: insert or update on table "children" violates foreign key constraint "children_id_fkey"
--    DETAIL: Key (id)=(40513132-f9fa-4e5a-aa46-20c8185b3e58) is not present in table "parent".
--    SQL state: 23503
insert into "children" values (default);
The rules system supposedly transforms the insert statement and executed the rule action in the same transaction. So I think it should work.
But I got the same error on both pg13 and pg14.

Is there something I missed here? or is my understanding of the rule system just simply wrong?

Regards,

Louis Tian
louis(dot)tian(at)aquamonix(dot)com(dot)au

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2022-09-21 04:03:06 Re: tcp settings
Previous Message Rob Sargent 2022-09-21 00:54:55 Re: I slipped up so that no existing role allows connection. Is rescue possible?