Another version. I realized that attaching a partitioned partition had
further trouble, because the recursion at each step would consider all
FKs instead of only the FKs that had been cloned. So I had to split out
the recursive step of the cloning. Now that works fine.
In order to make this work, I made two little change to struct
ForeignKeyCacheInfo: first, the constraint OID was added. Second, I
made RelationGetFKeyList() return a nonempty list for partitioned
tables, which it didn't before (because of the optimization that
presupposes no triggers means no FKs, which is not true for partitioned
tables). As far as I can see, this has no effect on how the planner
uses this function. (This stuff could be done with repeated scans of
pg_constraint, but it seems much simpler this way.)
Michael sent me his test case offlist, and I verified that it works
correctly with this patch.
Unless there are objections, I intend to get this pushed tomorrow.
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services