> Junwang Zhao <zhjwpku@gmail.com> 于2024年7月26日周五 14:57写道: > > > There is a bug report[0] Tender comments might be the same issue as > > this one, but I tried Alvaro's and mine patch, neither could solve > > that problem, I did not tried Tender's earlier patch thought. I post > > the test script below in case you are interested. > > My earlier patch should handle Alexander reported case. But I did not > do more test. I'm not sure that wether or not has dismatching between > pg_constraint and pg_trigger. > > I aggred with Alvaro said that "requires a much more invasive > solution".
Here's the patch which, as far as I can tell, fixes all the reported problems (other than the one in bug 18541, for which I proposed an unrelated fix in that thread[1]). If you can double-check, I would very much appreciate that. Also, I think the test cases the patch adds reflect the provided examples sufficiently, but if we're still failing to cover some, please let me know.
When I review Jehan-Guillaume v2 patch, I found the below codes that need
a little tweak. In DetachPartitionFinalize()
/* * If the referenced side is partitioned (which we know because our * parent's constraint points to a different relation than ours) then * we must, in addition to the above, create pg_constraint rows that * point to each partition, each with its own action triggers. */ if (parentConForm->conrelid != conform->conrelid)
I found that the above IF was always true, regardless of whether the referenced side is partitioned.
Although find_all_inheritors() can return an empty children list when the referenced side is not partitioned,
we can avoid much useless work.
How about this way:
if (get_rel_relkind(conform->confrelid) == RELKIND_PARTITIONED_TABLE)