On Fri, Sep 30, 2022 at 3:30 PM Jehan-Guillaume de Rorthais <j...@dalibo.com> wrote:
> Hi, > > Please, find in attachment a small serie of patch: > > 0001 fix the constraint parenting bug. Not much to say. It's basically > your > patch we discussed with some more comments and the check on contype > equals to > either primary, unique or exclusion. > > 0002 fix the self-FK being cloned twice on partitions > > 0003 add a regression test validating both fix. > > I should confess than even with these fix, I'm still wondering about this > code > sanity as we could still end up with a PK on a partition being parented > with a > simple unique constraint from the table, on a field not even NOT NULL: > > DROP TABLE IF EXISTS parted_self_fk, part_with_pk; > > CREATE TABLE parted_self_fk ( > id bigint, > id_abc bigint, > FOREIGN KEY (id_abc) REFERENCES parted_self_fk(id), > UNIQUE (id) > ) > PARTITION BY RANGE (id); > > CREATE TABLE part_with_pk ( > id bigint PRIMARY KEY, > id_abc bigint, > CHECK ((id >= 0 AND id < 10)) > ); > > ALTER TABLE parted_self_fk ATTACH > PARTITION part_with_pk FOR VALUES FROM (0) TO (10); > > SELECT cr.relname, co.conname, co.contype, p.conname AS conparentrelname > FROM pg_catalog.pg_constraint co > JOIN pg_catalog.pg_class cr ON cr.oid = co.conrelid > LEFT JOIN pg_catalog.pg_constraint p ON p.oid = co.conparentid > WHERE cr.relname IN ('parted_self_fk', 'part_with_pk') > AND co.contype IN ('u', 'p'); > > DROP TABLE parted_self_fk; > > DROP TABLE > CREATE TABLE > CREATE TABLE > ALTER TABLE > relname | conname | contype | conparentrelname > > > ----------------+-----------------------+---------+----------------------- > parted_self_fk | parted_self_fk_id_key | u | > part_with_pk | part_with_pk_pkey | p | parted_self_fk_id_key > (2 rows) > > Nothing forbid the partition to have stricter constraints than the parent > table, but it feels weird, so it might worth noting it here. > > I wonder if AttachPartitionEnsureConstraints() should exists and take care > of > comparing/cloning constraints before calling AttachPartitionEnsureIndexes() > which would handle missing index without paying attention to related > constraints? > > Regards, > > On Wed, 24 Aug 2022 12:49:13 +0200 > Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote: > > > On 2022-Aug-24, Jehan-Guillaume de Rorthais wrote: > > > > > I was naively wondering about such a patch, but was worrying about > potential > > > side effects on ATExecAttachPartitionIdx(), DetachPartitionFinalize() > and > > > DefineIndex() where I didn't had a single glance. Did you had a look? > > > > No. But AFAIR all the code there is supposed to worry about unique > > constraints and PK only, not FKs. So if something changes, then most > > likely it was wrong to begin with. > > > > > I did a quick ATTACH + DETACH test, and it seems DETACH partly fails > with > > > its housecleaning: > > > > Ugh. More fixes required, then. > > > > > Looking for few minutes in ATExecDetachPartitionFinalize(), it seems > it only > > > support removing the parental link on FK, not to clean the FKs added > during > > > the ATTACH DDL anyway. That explains the FK child1->parent left > behind. But > > > in fact, this let me wonder if this part of the code ever considered > > > implication of self-FK during the ATTACH and DETACH process? > > > > No, or at least I don't remember thinking about self-referencing FKs. > > If there are no tests for it, then that's likely what happened. > > > > > Why in the first place TWO FK are created during the ATTACH DDL? > > > > That's probably a bug too. > > > > Hi, + * Self-Foreign keys are ignored as the index was preliminary created preliminary created -> primarily created Cheers