diff options
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index d07476d8ddf..74eb7ac8d76 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -174,6 +174,7 @@ typedef struct AlteredTableInfo List *changedConstraintDefs; /* string definitions of same */ List *changedIndexOids; /* OIDs of indexes to rebuild */ List *changedIndexDefs; /* string definitions of same */ + char *replicaIdentityIndex; /* index to reset as REPLICA IDENTITY */ } AlteredTableInfo; /* Struct describing one new constraint to check in Phase 3 scan */ @@ -11139,6 +11140,22 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, } /* + * Subroutine for ATExecAlterColumnType: remember that a replica identity + * needs to be reset. + */ +static void +RememberReplicaIdentityForRebuilding(Oid indoid, AlteredTableInfo *tab) +{ + if (!get_index_isreplident(indoid)) + return; + + if (tab->replicaIdentityIndex) + elog(ERROR, "relation %u has multiple indexes marked as replica identity", tab->relid); + + tab->replicaIdentityIndex = get_rel_name(indoid); +} + +/* * Subroutine for ATExecAlterColumnType: remember that a constraint needs * to be rebuilt (which we might already know). */ @@ -11156,11 +11173,16 @@ RememberConstraintForRebuilding(Oid conoid, AlteredTableInfo *tab) { /* OK, capture the constraint's existing definition string */ char *defstring = pg_get_constraintdef_command(conoid); + Oid indoid; tab->changedConstraintOids = lappend_oid(tab->changedConstraintOids, conoid); tab->changedConstraintDefs = lappend(tab->changedConstraintDefs, defstring); + + indoid = get_constraint_index(conoid); + if (OidIsValid(indoid)) + RememberReplicaIdentityForRebuilding(indoid, tab); } } @@ -11203,6 +11225,8 @@ RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab) indoid); tab->changedIndexDefs = lappend(tab->changedIndexDefs, defstring); + + RememberReplicaIdentityForRebuilding(indoid, tab); } } } @@ -11312,6 +11336,24 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) } /* + * Queue up command to restore replica identity index marking + */ + if (tab->replicaIdentityIndex) + { + AlterTableCmd *cmd = makeNode(AlterTableCmd); + ReplicaIdentityStmt *subcmd = makeNode(ReplicaIdentityStmt); + + subcmd->identity_type = REPLICA_IDENTITY_INDEX; + subcmd->name = tab->replicaIdentityIndex; + cmd->subtype = AT_ReplicaIdentity; + cmd->def = (Node *) subcmd; + + /* do it after indexes and constraints */ + tab->subcmds[AT_PASS_OLD_CONSTR] = + lappend(tab->subcmds[AT_PASS_OLD_CONSTR], cmd); + } + + /* * It should be okay to use DROP_RESTRICT here, since nothing else should * be depending on these objects. */ |