mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Fix failure to create FKs correctly in partitions
On a multi-level partioned table, when adding a partition not directly
connected to the root table, foreign key constraints referencing the
root were not cloned to the new partition, leading to the FK being
possibly inadvertently violated later on.
This was caused by fuzzy thinking in CloneFkReferenced (commit
f56f8f8da6
): it was skipping constraints marked as having parents on
the theory that cloning those would create duplicates; but that's only
correct for the top level of the partitioning hierarchy. For levels
below that one, such constraints must still be considered and only
skipped if later on we see that we'd create duplicates. Apparently, I
(Álvaro) wrote the comments right but the code implemented something
slightly different.
Author: Jehan-Guillaume de Rorthais
Discussion: https://postgr.es/m/20200206004948.238352db@firost
This commit is contained in:
@ -2444,3 +2444,27 @@ DROP SCHEMA fkpart8 CASCADE;
|
||||
NOTICE: drop cascades to 2 other objects
|
||||
DETAIL: drop cascades to table fkpart8.tbl1
|
||||
drop cascades to table fkpart8.tbl2
|
||||
-- ensure FK referencing a multi-level partitioned table are
|
||||
-- enforce reference to sub-children.
|
||||
CREATE SCHEMA fkpart9
|
||||
CREATE TABLE pk (a INT PRIMARY KEY) PARTITION BY RANGE (a)
|
||||
CREATE TABLE fk (
|
||||
fk_a INT REFERENCES pk(a) ON DELETE CASCADE
|
||||
)
|
||||
CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (30) TO (50) PARTITION BY RANGE (a)
|
||||
CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (30) TO (40);
|
||||
INSERT INTO fkpart9.pk VALUES (35);
|
||||
INSERT INTO fkpart9.fk VALUES (35);
|
||||
DELETE FROM fkpart9.pk WHERE a=35;
|
||||
SELECT fk.fk_a, pk.a
|
||||
FROM fkpart9.fk
|
||||
LEFT JOIN fkpart9.pk ON fk.fk_a = pk.a
|
||||
WHERE fk.fk_a=35;
|
||||
fk_a | a
|
||||
------+---
|
||||
(0 rows)
|
||||
|
||||
DROP SCHEMA fkpart9 CASCADE;
|
||||
NOTICE: drop cascades to 2 other objects
|
||||
DETAIL: drop cascades to table fkpart9.pk
|
||||
drop cascades to table fkpart9.fk
|
||||
|
@ -1722,3 +1722,21 @@ INSERT INTO fkpart8.tbl2 VALUES(1);
|
||||
ALTER TABLE fkpart8.tbl2 DROP CONSTRAINT tbl2_f1_fkey;
|
||||
COMMIT;
|
||||
DROP SCHEMA fkpart8 CASCADE;
|
||||
|
||||
-- ensure FK referencing a multi-level partitioned table are
|
||||
-- enforce reference to sub-children.
|
||||
CREATE SCHEMA fkpart9
|
||||
CREATE TABLE pk (a INT PRIMARY KEY) PARTITION BY RANGE (a)
|
||||
CREATE TABLE fk (
|
||||
fk_a INT REFERENCES pk(a) ON DELETE CASCADE
|
||||
)
|
||||
CREATE TABLE pk1 PARTITION OF pk FOR VALUES FROM (30) TO (50) PARTITION BY RANGE (a)
|
||||
CREATE TABLE pk11 PARTITION OF pk1 FOR VALUES FROM (30) TO (40);
|
||||
INSERT INTO fkpart9.pk VALUES (35);
|
||||
INSERT INTO fkpart9.fk VALUES (35);
|
||||
DELETE FROM fkpart9.pk WHERE a=35;
|
||||
SELECT fk.fk_a, pk.a
|
||||
FROM fkpart9.fk
|
||||
LEFT JOIN fkpart9.pk ON fk.fk_a = pk.a
|
||||
WHERE fk.fk_a=35;
|
||||
DROP SCHEMA fkpart9 CASCADE;
|
||||
|
Reference in New Issue
Block a user