diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index b57aa95fafd..844d413adce 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -3191,11 +3191,8 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence) indexInfo->ii_ExclusionStrats = NULL; } - /* Set the relpersistence of the new index */ - iRel->rd_rel->relpersistence = persistence; - /* We'll build a new physical relation for the index */ - RelationSetNewRelfilenode(iRel, InvalidTransactionId, + RelationSetNewRelfilenode(iRel, persistence, InvalidTransactionId, InvalidMultiXactId); /* Initialize the index and rebuild */ diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index e5f7765d556..cb8b27a93c0 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -303,8 +303,8 @@ ResetSequence(Oid seq_relid) * sequence's relfrozenxid at 0, since it won't contain any unfrozen XIDs. * Same with relminmxid, since a sequence will never contain multixacts. */ - RelationSetNewRelfilenode(seq_rel, InvalidTransactionId, - InvalidMultiXactId); + RelationSetNewRelfilenode(seq_rel, seq_rel->rd_rel->relpersistence, + InvalidTransactionId, InvalidMultiXactId); /* * Insert the modified tuple into the new storage file. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 093224f4e64..56294552e71 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1196,7 +1196,8 @@ ExecuteTruncate(TruncateStmt *stmt) * as the relfilenode value. The old storage file is scheduled for * deletion at commit. */ - RelationSetNewRelfilenode(rel, RecentXmin, minmulti); + RelationSetNewRelfilenode(rel, rel->rd_rel->relpersistence, + RecentXmin, minmulti); if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) heap_create_init_fork(rel); @@ -1209,7 +1210,8 @@ ExecuteTruncate(TruncateStmt *stmt) if (OidIsValid(toast_relid)) { rel = relation_open(toast_relid, AccessExclusiveLock); - RelationSetNewRelfilenode(rel, RecentXmin, minmulti); + RelationSetNewRelfilenode(rel, rel->rd_rel->relpersistence, + RecentXmin, minmulti); if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) heap_create_init_fork(rel); heap_close(rel, NoLock); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 2250c56d28b..c80ef3c6f89 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3005,10 +3005,14 @@ RelationBuildLocalRelation(const char *relname, * The relation is marked with relfrozenxid = freezeXid (InvalidTransactionId * must be passed for indexes and sequences). This should be a lower bound on * the XIDs that will be put into the new relation contents. + * + * The new filenode's persistence is set to the given value. This is useful + * for the cases that are changing the relation's persistence; other callers + * need to pass the original relpersistence value. */ void -RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, - MultiXactId minmulti) +RelationSetNewRelfilenode(Relation relation, char persistence, + TransactionId freezeXid, MultiXactId minmulti) { Oid newrelfilenode; RelFileNodeBackend newrnode; @@ -3025,7 +3029,7 @@ RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, /* Allocate a new relfilenode */ newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace, NULL, - relation->rd_rel->relpersistence); + persistence); /* * Get a writable copy of the pg_class tuple for the given relation. @@ -3048,7 +3052,7 @@ RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, newrnode.node = relation->rd_node; newrnode.node.relNode = newrelfilenode; newrnode.backend = relation->rd_backend; - RelationCreateStorage(newrnode.node, relation->rd_rel->relpersistence); + RelationCreateStorage(newrnode.node, persistence); smgrclosenode(newrnode); /* @@ -3078,7 +3082,7 @@ RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, } classform->relfrozenxid = freezeXid; classform->relminmxid = minmulti; - classform->relpersistence = relation->rd_rel->relpersistence; + classform->relpersistence = persistence; simple_heap_update(pg_class, &tuple->t_self, tuple); CatalogUpdateIndexes(pg_class, tuple); diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h index e4ca70f1404..35f2a087e5e 100644 --- a/src/include/utils/relcache.h +++ b/src/include/utils/relcache.h @@ -95,7 +95,7 @@ extern Relation RelationBuildLocalRelation(const char *relname, /* * Routine to manage assignment of new relfilenode to a relation */ -extern void RelationSetNewRelfilenode(Relation relation, +extern void RelationSetNewRelfilenode(Relation relation, char persistence, TransactionId freezeXid, MultiXactId minmulti); /*