Jehan-Guillaume de Rorthais <j...@dalibo.com> 于2024年9月3日周二 05:02写道:

> Hi,
>
> On Tue, 20 Aug 2024 23:09:27 -0400
> Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote:
>
> > On 2024-Aug-20, Jehan-Guillaume de Rorthais wrote:
> >
> > > I'm back on this issue as well. I start poking at this patch to review
> it,
> > > test it, challenge it and then report here.
> > >
> > > I'll try to check if some other issues might have lost/forgot on they
> way as
> > > well.
> >
> > Thanks, much appreciated, looking forward to your feedback.
>
> Sorry, it took me a while to come back to you on this topic. It has been
> hard to
> untangle subjects, reproductions and patch…
>
> There's three distinct issues/thread:
>
> * Constraint & trigger catalog cleanup [1] (this thread)
> * FK broken after DETACH [2]
> * Maintenance consideration about self referencing FK between partitions
> [3]
>

The third issue has been fixed, and codes have been pushed.  Because of my
misunderstanding,
It should not be here.


> 0. Splitting in two commits
>
>   Your patch addresses two bugs:
>
>     * one for the constraint & trigger catalog cleanup;
>     * one for the FK broken after DETACH.
>
>   These issues are unrelated, therefore I am wondering if it would be
> better
>   to split their resolution in two different patches.
>
>   Last year, I reported them in two different threads [1][2]. The first
> with
>   implementation consideration, the second with a demo/proposal/draft fix.
>
>   Unfortunately, this discussion about the first bug slipped to the second
> one
>   when Tender stumbled on this bug as well and reported it. But, both bugs
> can
>   be triggered independently, and have distinct fixes.
>

It's ok that these two issues are fixed together.  It is  because current
codes don't handle better
when the referenced side is the partition table.


>   Finally, splitting the patch might help setting finer patch
> co-authoring. I
>   know my patch for [2] was a draft and somewhat trivial, but I spend a
> fair
>   amount of time to report, then produce a draft patch, so I was wondering
> if
>   it would be candidate to a co-author flag on this (small, humble and
>   refactored by you) patch?
>
>   I'm definitely not involved (yet) in the second part though.
>
> 1. Constraint & trigger catalog cleanup [1]
>
>   I have been focusing on the current master branch and haven't taken into
>   consideration backpatching related issues yet.
>
>   When I first studied this bug and reported it, I held on writing a patch
>   because it seemed it would duplicate some existing code. I wrote:
>
>   > I poked around DetachPartitionFinalize() to try to find a way to fix
> this,
>   > but it looks like it would duplicate a bunch of code from other code
> path
>   > (eg. from CloneFkReferenced).
>
>   My proposal was to clean everything related to the old FK and use some
>   existing code path to create a fresh and cleaner one. This requires some
>   refactoring in existing code, but we would win a common path of code
> between
>   create/attach/detach, a cleaner catalog and easier code maintenance.
>
>   I've finally been able to write a PoC that implement this by calling
>   addFkRecurseReferenced() from DetachPartitionFinalize(). I can't join
>   it here because it is currently an ugly draft and I still have some work
>   to do. But I would really like to have a little more time (one or two
> days) to
>   explore this avenue further before you commit yours, if you don't mind?
> Or
>   maybe you already have considered this avenue and rejected it?
>
>
> 2. FK broken after DETACH [2]
>
>   Comparing your patch to my draft from [2], I just have a question about
> the
>   refactoring.
>
>   Fencing the constraint/trigger removal inside a conditional
>   RELKIND_PARTITIONED_TABLE block of code was obvious. It avoids some
> useless
>   catalog scan compared to my draft patch.
>
>   Also, the "contype == CONSTRAINT_FOREIGN" I had sounds safe to remove.
>
>   However, is it clean/light enough to add the "conparentid == fk->conoid"
> in
>   the scan key as I did? I'm not sure it saves anything else but the small
>   conditional block you inserted inside the loop, but I wonder if there's a
>   serious concern about this anyway?
>
>   Last, considering the tests, I think we should add some rows in the
> tables,
>   to make sure the FK is correctly enforced after DETACH. Something like:
>
>     CREATE SCHEMA fkpart12
>       CREATE TABLE fk_p ( id bigint PRIMARY KEY ) PARTITION BY list (id)
>       CREATE TABLE fk_p_1 PARTITION OF fk_p FOR VALUES IN (1)
>       CREATE TABLE fk_p_2 PARTITION OF fk_p FOR VALUES IN (2)
>       CREATE TABLE fk_r_1 ( id bigint PRIMARY KEY, p_id bigint NOT NULL)
>       CREATE TABLE fk_r_2 ( id bigint PRIMARY KEY, p_id bigint NOT NULL)
>       CREATE TABLE fk_r   ( id bigint PRIMARY KEY, p_id bigint NOT NULL,
>          FOREIGN KEY (p_id) REFERENCES fk_p (id)
>       ) PARTITION BY list (id);
>     SET search_path TO fkpart12;
>
>     INSERT INTO fk_p VALUES (1);
>
>     ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2);
>
>     ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1);
>     \d fk_r_1
>
>     INSERT INTO fk_r VALUES (1,1);
>
>     ALTER TABLE fk_r DETACH PARTITION fk_r_1;
>     \d fk_r_1
>
>     INSERT INTO c_1 VALUES (2,2); -- fails as EXPECTED
>     DELETE FROM p; -- should fails but was buggy
>
>     ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1);
>     \d fk_r_1
>
>
> 3. Self referencing FK between partitions [3]
>
>   You added to your commit message:
>
>     verify: 20230707175859.17c91538@karst
>
>   I'm not sure what the "verify" flag means. Unfortunately, your patch
> doesn't
>   help on this topic.
>
>   This bug really needs more discussion and design consideration. I have
>   thought about this problem and haven't found any solution that don't
> involve
>   breaking the current core behavior. It really looks like an impossible
> bug to
>   fix without dropping the constraint itself. On both side. Maybe the only
> sane
>   behavior would be to forbid detaching the partition if it would break the
>   constraint.
>
>   But let's discuss this on the related thread, should we?
>
>
> Thank you for reading me all the way down to the bottom!
>
> Regards,
>
> [1] https://www.postgresql.org/message-id/20230705233028.2f554f73%40karst
> [2] https://www.postgresql.org/message-id/20230420144344.40744130%40karst
> [3] https://www.postgresql.org/message-id/20230707175859.17c91538%40karst
>
>
>
>

-- 
Tender Wang

Reply via email to