mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Support adding partitioned tables to publication
When a partitioned table is added to a publication, changes of all of its partitions (current or future) are published via that publication. This change only affects which tables a publication considers as its members. The receiving side still sees the data coming from the individual leaf partitions. So existing restrictions that partition hierarchies can only be replicated one-to-one are not changed by this. Author: Amit Langote <amitlangote09@gmail.com> Reviewed-by: Rafia Sabih <rafia.pghackers@gmail.com> Reviewed-by: Peter Eisentraut <peter.eisentraut@2ndquadrant.com> Discussion: https://www.postgresql.org/message-id/flat/CA+HiwqH=Y85vRK3mOdjEkqFK+E=ST=eQiHdpj43L=_eJMOOznQ@mail.gmail.com
This commit is contained in:
@ -299,7 +299,13 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel,
|
||||
}
|
||||
else
|
||||
{
|
||||
List *relids = GetPublicationRelations(pubform->oid);
|
||||
/*
|
||||
* For any partitioned tables contained in the publication, we must
|
||||
* invalidate all partitions contained in the respective partition
|
||||
* trees, not just those explicitly mentioned in the publication.
|
||||
*/
|
||||
List *relids = GetPublicationRelations(pubform->oid,
|
||||
PUBLICATION_PART_ALL);
|
||||
|
||||
/*
|
||||
* We don't want to send too many individual messages, at some point
|
||||
@ -356,7 +362,8 @@ AlterPublicationTables(AlterPublicationStmt *stmt, Relation rel,
|
||||
PublicationDropTables(pubid, rels, false);
|
||||
else /* DEFELEM_SET */
|
||||
{
|
||||
List *oldrelids = GetPublicationRelations(pubid);
|
||||
List *oldrelids = GetPublicationRelations(pubid,
|
||||
PUBLICATION_PART_ROOT);
|
||||
List *delrels = NIL;
|
||||
ListCell *oldlc;
|
||||
|
||||
@ -498,7 +505,8 @@ RemovePublicationRelById(Oid proid)
|
||||
|
||||
/*
|
||||
* Open relations specified by a RangeVar list.
|
||||
* The returned tables are locked in ShareUpdateExclusiveLock mode.
|
||||
* The returned tables are locked in ShareUpdateExclusiveLock mode in order to
|
||||
* add them to a publication.
|
||||
*/
|
||||
static List *
|
||||
OpenTableList(List *tables)
|
||||
@ -539,8 +547,13 @@ OpenTableList(List *tables)
|
||||
rels = lappend(rels, rel);
|
||||
relids = lappend_oid(relids, myrelid);
|
||||
|
||||
/* Add children of this rel, if requested */
|
||||
if (recurse)
|
||||
/*
|
||||
* Add children of this rel, if requested, so that they too are added
|
||||
* to the publication. A partitioned table can't have any inheritance
|
||||
* children other than its partitions, which need not be explicitly
|
||||
* added to the publication.
|
||||
*/
|
||||
if (recurse && rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
|
||||
{
|
||||
List *children;
|
||||
ListCell *child;
|
||||
|
Reference in New Issue
Block a user