BUG #18156: Self-referential foreign key in partitioned table not enforced on deletes
PG Bug reporting form <noreply@postgresql.org>
From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: fastcat@gmail.com
Date: 2023-10-13T14:26:56Z
Lists: pgsql-bugs
The following bug has been logged on the website:
Bug reference: 18156
Logged by: Matthew Gabeler-Lee
Email address: fastcat@gmail.com
PostgreSQL version: 16.0
Operating system: Linux
Description:
When a partitioned table has a self-referential foreign key, I'm finding
that the key is not enforced during deletes from the table.
A simple repro script:
create table x (
p int4 not null,
i int4 not null,
f int4 null,
primary key (p, i),
foreign key (p, f) references x (p, i)
)
partition by list (p);
create table x1 partition of x for values in (0);
insert into x values (0,1,null), (0,2,1);
delete from x where (p,i) = (0,1);
select * from x;
The final select shows the one row with the clearly violated foreign key
values:
p | i | f
---+---+---
0 | 2 | 1
(1 row)
I've reproduced this with 15.4 and 16.0 using the official docker images,
specifically `postgres/15-alpine` and `postgres/16-alpine`. I haven't tested
older versions as my application requires features new to 15.x. I've tried
with both list and hash partitioning, and it reproduces with both. I can
only reproduce it with self-referential foreign keys and only with
partitioned tables.
I discovered this with a slightly more complex situation involving an `on
delete set null` clause in the FK, but as seen above that is not required to
reproduce the issue.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Handle self-referencing FKs correctly in partitioned tables
- f51ae3187472 17.5 landed
- c83a38758d2a 18.0 landed
- b3a9c536db67 13.21 landed
- 6ba979cf570c 15.13 landed
- 1817d62ecbf5 16.9 landed
- 1649d153a172 14.18 landed
-
Restructure foreign key handling code for ATTACH/DETACH
- 5914a22f6ea5 17.1 cited
-
Fix self-referencing foreign keys with partitioned tables
- 614a406b4ff1 16.0 cited