> From: Masahiko Sawada <sawada.m...@gmail.com> > > > While writing a PoC patch, I found some difficulties in this idea. > > > First, I tried to add schemaname+relname to pg_subscription_rel but > > > I could not define the primary key of pg_subscription_rel. The > > > primary key on (srsubid, srrelid) doesn't work since srrelid could be > > > NULL. > > > Similarly, the primary key on (srsubid, srrelid, schemaname, > > > relname) also doesn't work. > > > > > > > Can we think of having a separate catalog table say > > pg_subscription_remote_rel for this? You can have srsubid, > > remote_schema_name, remote_rel_name, etc. We may need some other > state > > to be maintained during the initial schema sync where this table can > > be used. Basically, this can be used to maintain the state till the > > initial schema sync is complete because we can create a relation entry > > in pg_subscritption_rel only after the initial schema sync is > > complete. > > It might not be ideal but I guess it works. But I think we need to modify the > name > of replication slot for initial sync as it currently includes OID of the > table: > > void > ReplicationSlotNameForTablesync(Oid suboid, Oid relid, > char *syncslotname, Size szslot) { > snprintf(syncslotname, szslot, "pg_%u_sync_%u_" UINT64_FORMAT, suboid, > relid, GetSystemIdentifier()); } > > If we use both schema name and table name, it's possible that slot names are > duplicated if schema and/or table names are long. Another idea is to use the > hash value of schema+table names, but it cannot completely eliminate that > possibility, and probably would make investigation and debugging hard in case > of any failure. Probably we can use the OID of each entry in > pg_subscription_remote_rel instead, but I'm not sure it's a good idea, mainly > because we will end up using twice as many OIDs as before.
Maybe we can create serial primary key for pg_subscription_remote_rel table And use this key for creating replication slot ? Regards Sachin