diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 81dbed33d5..8f3e092072 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -66,6 +66,7 @@ static void publication_invalidation_cb(Datum arg, int cacheid, uint32 hashvalue); static void send_relation_and_attrs(Relation relation, TransactionId xid, LogicalDecodingContext *ctx); +static bool relation_need_publication(Oid relid, Oid puboid); /* * Entry in the map used to remember which relation schemas we sent. @@ -1044,6 +1045,9 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) entry->pubactions.pubupdate |= pub->pubactions.pubupdate; entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; + } else if (!relation_need_publication(relid, pub->oid)) { + entry->pubactions.pubinsert = entry->pubactions.pubupdate = + entry->pubactions.pubdelete = entry->pubactions.pubtruncate = false; } if (entry->pubactions.pubinsert && entry->pubactions.pubupdate && @@ -1171,3 +1175,18 @@ rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) while ((entry = (RelationSyncEntry *) hash_seq_search(&status)) != NULL) entry->replicate_valid = false; } + +static bool +relation_need_publication(Oid relid, Oid puboid) +{ + HeapTuple tup; + + tup = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(relid), ObjectIdGetDatum(puboid)); + if (!HeapTupleIsValid(tup)) + return false; + + ReleaseSysCache(tup); + + return true; +}