On Mon, 17 Feb 2025 at 20:13, vignesh C <vignes...@gmail.com> wrote: > > On Fri, 14 Feb 2025 at 12:59, Shlok Kyal <shlok.kyal....@gmail.com> wrote: > > > > I have used the changes suggested by you. Also I have updated the > > comments and the function name. > > There is another concurrency issue possible: > +/* Check if a partitioned table has a foreign partition */ > +bool > +check_partrel_has_foreign_table(Form_pg_class relform) > +{ > + bool has_foreign_tbl = false; > + > + if (relform->relkind == RELKIND_PARTITIONED_TABLE) > + { > + List *relids = NIL; > + > + relids = find_all_inheritors(relform->oid, NoLock, NULL); > > Create a publication with publish_via_partition_root as true, hold the > execution after check_partrel_has_foreign_table execution finishes. > Then parallely execute the following: > CREATE TABLE t1(id int) PARTITION BY RANGE(id); > CREATE TABLE part1 PARTITION OF t1 FOR VALUES FROM (0) TO (5); > CREATE TABLE part2 PARTITION OF t1 FOR VALUES FROM (5) TO (15) > PARTITION BY RANGE(id); > CREATE FOREIGN TABLE part2_1 PARTITION OF part2 FOR VALUES FROM (10) > TO (15) SERVER fdw > > Now both the partitioned table having foreign table and a publication > will be created. >
Hi Vignesh, I have addressed the above issue. If we take a ShareLock on the pg_class, we won't be able to create table concurrently, which may address the issue. Thoughts? I have attached the v8 patch here. Thanks and Regards, Shlok Kyal
v8-0001-Restrict-publishing-of-partitioned-table-with-for.patch
Description: Binary data