diff options
| author | Amit Kapila <akapila@postgresql.org> | 2021-09-22 08:00:54 +0530 |
|---|---|---|
| committer | Amit Kapila <akapila@postgresql.org> | 2021-09-22 08:00:54 +0530 |
| commit | 4548c76738b368a11a5dad052f9653a349eeb52c (patch) | |
| tree | 092a834c78cbe2006f9ae24d9e2786990618fb2e /src/include | |
| parent | 5e77625b260a781316bb94ea9750dc66c50152bf (diff) | |
Invalidate all partitions for a partitioned table in publication.
Updates/Deletes on a partition were allowed even without replica identity
after the parent table was added to a publication. This would later lead
to an error on subscribers. The reason was that we were not invalidating
the partition's relcache and the publication information for partitions
was not getting rebuilt. Similarly, we were not invalidating the
partitions' relcache after dropping a partitioned table from a publication
which will prohibit Updates/Deletes on its partition without replica
identity even without any publication.
Reported-by: Haiying Tang
Author: Hou Zhijie and Vignesh C
Reviewed-by: Vignesh C and Amit Kapila
Backpatch-through: 13
Discussion: https://postgr.es/m/OS0PR01MB6113D77F583C922F1CEAA1C3FBD29@OS0PR01MB6113.jpnprd01.prod.outlook.com
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/catalog/pg_publication.h | 3 | ||||
| -rw-r--r-- | src/include/commands/publicationcmds.h | 5 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 561266aa3ee..82f2536c657 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -111,6 +111,9 @@ typedef enum PublicationPartOpt extern List *GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(bool pubviaroot); +extern List *GetPubPartitionOptionRelations(List *result, + PublicationPartOpt pub_partopt, + Oid relid); extern bool is_publishable_relation(Relation rel); extern ObjectAddress publication_add_relation(Oid pubid, PublicationRelInfo *targetrel, diff --git a/src/include/commands/publicationcmds.h b/src/include/commands/publicationcmds.h index c98d519b29d..77a299bb187 100644 --- a/src/include/commands/publicationcmds.h +++ b/src/include/commands/publicationcmds.h @@ -17,6 +17,10 @@ #include "catalog/objectaddress.h" #include "parser/parse_node.h" +#include "utils/inval.h" + +/* Same as MAXNUMMESSAGES in sinvaladt.c */ +#define MAX_RELCACHE_INVAL_MSGS 4096 extern ObjectAddress CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt); extern void AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt); @@ -25,5 +29,6 @@ extern void RemovePublicationRelById(Oid proid); extern ObjectAddress AlterPublicationOwner(const char *name, Oid newOwnerId); extern void AlterPublicationOwner_oid(Oid pubid, Oid newOwnerId); +extern void InvalidatePublicationRels(List *relids); #endif /* PUBLICATIONCMDS_H */ |
