summaryrefslogtreecommitdiff
path: root/src/backend/commands/publicationcmds.c
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2021-09-08 10:20:02 +0530
committerAmit Kapila <akapila@postgresql.org>2021-09-08 12:14:59 +0530
commitddfc7299d0a3a41f0c178a8157bd751430428e8a (patch)
tree467e0de894c473d7ec72f756517f85c6184bf463 /src/backend/commands/publicationcmds.c
parentaae398a87cfafcb1d62fd1e464b2c4d2525a039a (diff)
Invalidate relcache for publications defined for all tables.
Updates/Deletes on a relation were allowed even without replica identity after we define the publication for all tables. This would later lead to an error on subscribers. The reason was that for such publications we were not invalidating the relcache and the publication information for relations was not getting rebuilt. Similarly, we were not invalidating the relcache after dropping of such publications which will prohibit Updates/Deletes without replica identity even without any publication. Author: Vignesh C and Hou Zhijie Reviewed-by: Hou Zhijie, Kyotaro Horiguchi, Amit Kapila Backpatch-through: 10, where it was introduced Discussion: https://postgr.es/m/CALDaNm0pF6zeWqCA8TCe2sDuwFAy8fCqba=nHampCKag-qLixg@mail.gmail.com
Diffstat (limited to 'src/backend/commands/publicationcmds.c')
-rw-r--r--src/backend/commands/publicationcmds.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index a5e29b5a827..879710143e1 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -236,6 +236,11 @@ CreatePublication(CreatePublicationStmt *stmt)
PublicationAddTables(puboid, rels, true, NULL);
CloseTableList(rels);
}
+ else if (stmt->for_all_tables)
+ {
+ /* Invalidate relcache so that publication info is rebuilt. */
+ CacheInvalidateRelcacheAll();
+ }
table_close(rel, RowExclusiveLock);
@@ -469,13 +474,14 @@ AlterPublication(AlterPublicationStmt *stmt)
}
/*
- * Drop publication by OID
+ * Remove the publication by mapping OID.
*/
void
RemovePublicationById(Oid pubid)
{
Relation rel;
HeapTuple tup;
+ Form_pg_publication pubform;
rel = table_open(PublicationRelationId, RowExclusiveLock);
@@ -484,6 +490,12 @@ RemovePublicationById(Oid pubid)
if (!HeapTupleIsValid(tup))
elog(ERROR, "cache lookup failed for publication %u", pubid);
+ pubform = (Form_pg_publication) GETSTRUCT(tup);
+
+ /* Invalidate relcache so that publication info is rebuilt. */
+ if (pubform->puballtables)
+ CacheInvalidateRelcacheAll();
+
CatalogTupleDelete(rel, &tup->t_self);
ReleaseSysCache(tup);