Hi all,
After looking at a patch of this commit fest using rd_rel->relpersistence, I got a look at how many times this expression was being used directly in the backend code and wondered if it would not be useful to add a dedicated macro in rel.h to get the persistence of a relation like in the patch attached. (Note: it is actually used 39 times). Thoughts? -- Michael
diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index f32e35a..4abba83 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -807,7 +807,7 @@ gistGetFakeLSN(Relation rel) { static XLogRecPtr counter = 1; - if (rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP) + if (RelationGetPersistence(rel) == RELPERSISTENCE_TEMP) { /* * Temporary relations are only accessible in our session, so a simple @@ -821,7 +821,7 @@ gistGetFakeLSN(Relation rel) * Unlogged relations are accessible from other backends, and survive * (clean) restarts. GetFakeLSNForUnloggedRel() handles that for us. */ - Assert(rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED); + Assert(RelationGetPersistence(rel) == RELPERSISTENCE_UNLOGGED); return GetFakeLSNForUnloggedRel(); } } diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 01ed880..ba896f7 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -723,7 +723,7 @@ index_create(Relation heapRelation, namespaceId = RelationGetNamespace(heapRelation); shared_relation = heapRelation->rd_rel->relisshared; mapped_relation = RelationIsMapped(heapRelation); - relpersistence = heapRelation->rd_rel->relpersistence; + relpersistence = RelationGetPersistence(heapRelation); /* * check parameters @@ -1965,7 +1965,7 @@ index_build(Relation heapRelation, * created it, or truncated twice in a subsequent transaction, the * relfilenode won't change, and nothing needs to be done here. */ - if (heapRelation->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED && + if (RelationGetPersistence(heapRelation) == RELPERSISTENCE_UNLOGGED && !smgrexists(indexRelation->rd_smgr, INIT_FORKNUM)) { RegProcedure ambuildempty = indexRelation->rd_am->ambuildempty; diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c index 160f006..cf20fbb 100644 --- a/src/backend/catalog/toasting.c +++ b/src/backend/catalog/toasting.c @@ -280,7 +280,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, tupdesc, NIL, RELKIND_TOASTVALUE, - rel->rd_rel->relpersistence, + RelationGetPersistence(rel), shared_relation, mapped_relation, true, diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index ff80b09..7bb68d7 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -575,7 +575,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose) /* Create the transient table that will receive the re-ordered data */ OIDNewHeap = make_new_heap(tableOid, tableSpace, - OldHeap->rd_rel->relpersistence, + RelationGetPersistence(OldHeap), AccessExclusiveLock); /* Copy the heap data into the new table in the desired order */ diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 3c1e90e..2aea20b 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -416,7 +416,7 @@ DefineIndex(Oid relationId, } else { - tablespaceId = GetDefaultTablespace(rel->rd_rel->relpersistence); + tablespaceId = GetDefaultTablespace(RelationGetPersistence(rel)); /* note InvalidOid is OK in this case */ } diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 30bd40d..605c9cd 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -258,7 +258,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, else { tableSpace = matviewRel->rd_rel->reltablespace; - relpersistence = matviewRel->rd_rel->relpersistence; + relpersistence = RelationGetPersistence(matviewRel); } /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index ecdff1e..21d11bc 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1197,7 +1197,7 @@ ExecuteTruncate(TruncateStmt *stmt) * deletion at commit. */ RelationSetNewRelfilenode(rel, RecentXmin, minmulti); - if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) + if (RelationGetPersistence(rel) == RELPERSISTENCE_UNLOGGED) heap_create_init_fork(rel); heap_relid = RelationGetRelid(rel); @@ -1210,7 +1210,7 @@ ExecuteTruncate(TruncateStmt *stmt) { rel = relation_open(toast_relid, AccessExclusiveLock); RelationSetNewRelfilenode(rel, RecentXmin, minmulti); - if (rel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) + if (RelationGetPersistence(rel) == RELPERSISTENCE_UNLOGGED) heap_create_init_fork(rel); heap_close(rel, NoLock); } @@ -1502,14 +1502,14 @@ MergeAttributes(List *schema, List *supers, char relpersistence, parent->relname))); /* Permanent rels cannot inherit from temporary ones */ if (relpersistence != RELPERSISTENCE_TEMP && - relation->rd_rel->relpersistence == RELPERSISTENCE_TEMP) + RelationGetPersistence(relation) == RELPERSISTENCE_TEMP) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot inherit from temporary relation \"%s\"", parent->relname))); /* If existing rel is temp, it must belong to this session */ - if (relation->rd_rel->relpersistence == RELPERSISTENCE_TEMP && + if (RelationGetPersistence(relation) == RELPERSISTENCE_TEMP && !relation->rd_islocaltemp) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -3704,7 +3704,7 @@ ATRewriteTables(List **wqueue, LOCKMODE lockmode) * user requested a change) */ persistence = tab->chgPersistence ? - tab->newrelpersistence : OldHeap->rd_rel->relpersistence; + tab->newrelpersistence : RelationGetPersistence(OldHeap); heap_close(OldHeap, NoLock); @@ -6051,23 +6051,23 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel, * backends might need to run the RI triggers on the perm table, but they * can't reliably see tuples in the local buffers of other backends. */ - switch (rel->rd_rel->relpersistence) + switch (RelationGetPersistence(rel)) { case RELPERSISTENCE_PERMANENT: - if (pkrel->rd_rel->relpersistence != RELPERSISTENCE_PERMANENT) + if (RelationGetPersistence(pkrel) != RELPERSISTENCE_PERMANENT) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("constraints on permanent tables may reference only permanent tables"))); break; case RELPERSISTENCE_UNLOGGED: - if (pkrel->rd_rel->relpersistence != RELPERSISTENCE_PERMANENT - && pkrel->rd_rel->relpersistence != RELPERSISTENCE_UNLOGGED) + if (RelationGetPersistence(pkrel) != RELPERSISTENCE_PERMANENT + && RelationGetPersistence(pkrel) != RELPERSISTENCE_UNLOGGED) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("constraints on unlogged tables may reference only permanent or unlogged tables"))); break; case RELPERSISTENCE_TEMP: - if (pkrel->rd_rel->relpersistence != RELPERSISTENCE_TEMP) + if (RelationGetPersistence(pkrel) != RELPERSISTENCE_TEMP) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("constraints on temporary tables may reference only temporary tables"))); @@ -9241,7 +9241,7 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode) * to allocate a new one in the new tablespace. */ newrelfilenode = GetNewRelFileNode(newTableSpace, NULL, - rel->rd_rel->relpersistence); + RelationGetPersistence(rel)); /* Open old and new relation */ newrnode = rel->rd_node; @@ -9258,11 +9258,11 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode) * NOTE: any conflict in relfilenode value will be caught in * RelationCreateStorage(). */ - RelationCreateStorage(newrnode, rel->rd_rel->relpersistence); + RelationCreateStorage(newrnode, RelationGetPersistence(rel)); /* copy main fork */ copy_relation_data(rel->rd_smgr, dstrel, MAIN_FORKNUM, - rel->rd_rel->relpersistence); + RelationGetPersistence(rel)); /* copy those extra forks that exist */ for (forkNum = MAIN_FORKNUM + 1; forkNum <= MAX_FORKNUM; forkNum++) @@ -9271,7 +9271,7 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode) { smgrcreate(dstrel, forkNum, false); copy_relation_data(rel->rd_smgr, dstrel, forkNum, - rel->rd_rel->relpersistence); + RelationGetPersistence(rel)); } } @@ -9625,22 +9625,22 @@ ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode) ATSimplePermissions(parent_rel, ATT_TABLE); /* Permanent rels cannot inherit from temporary ones */ - if (parent_rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP && - child_rel->rd_rel->relpersistence != RELPERSISTENCE_TEMP) + if (RelationGetPersistence(parent_rel) == RELPERSISTENCE_TEMP && + RelationGetPersistence(child_rel) != RELPERSISTENCE_TEMP) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot inherit from temporary relation \"%s\"", RelationGetRelationName(parent_rel)))); /* If parent rel is temp, it must belong to this session */ - if (parent_rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP && + if (RelationGetPersistence(parent_rel) == RELPERSISTENCE_TEMP && !parent_rel->rd_islocaltemp) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot inherit from temporary relation of another session"))); /* Ditto for the child */ - if (child_rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP && + if (RelationGetPersistence(child_rel) == RELPERSISTENCE_TEMP && !child_rel->rd_islocaltemp) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -10781,7 +10781,7 @@ ATPrepChangePersistence(Relation rel, bool toLogged) * get away with doing nothing; in such cases we don't need to run the * checks below, either. */ - switch (rel->rd_rel->relpersistence) + switch (RelationGetPersistence(rel)) { case RELPERSISTENCE_TEMP: ereport(ERROR, @@ -10844,7 +10844,7 @@ ATPrepChangePersistence(Relation rel, bool toLogged) if (toLogged) { - if (foreignrel->rd_rel->relpersistence != RELPERSISTENCE_PERMANENT) + if (RelationGetPersistence(foreignrel) != RELPERSISTENCE_PERMANENT) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("cannot change status of table %s to logged", @@ -10856,7 +10856,7 @@ ATPrepChangePersistence(Relation rel, bool toLogged) } else { - if (foreignrel->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + if (RelationGetPersistence(foreignrel) == RELPERSISTENCE_PERMANENT) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), errmsg("cannot change status of table %s to unlogged", diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index 184bcd0..551858c 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -162,7 +162,7 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace, * should only end up replacing a temporary view with another * temporary view, and similarly for permanent views. */ - Assert(relation->relpersistence == rel->rd_rel->relpersistence); + Assert(relation->relpersistence == RelationGetPersistence(rel)); /* * Create a tuple descriptor to compare against the existing view, and diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 478584d..fe3de1f 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -2921,7 +2921,7 @@ isQueryUsingTempRelation_walker(Node *node, void *context) if (rte->rtekind == RTE_RELATION) { Relation rel = heap_open(rte->relid, AccessShareLock); - char relpersistence = rel->rd_rel->relpersistence; + char relpersistence = RelationGetPersistence(rel); heap_close(rel, AccessShareLock); if (relpersistence == RELPERSISTENCE_TEMP) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 57067ef..6106bb1 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -536,7 +536,7 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, * miss. */ pgstat_count_buffer_read(reln); - buf = ReadBuffer_common(reln->rd_smgr, reln->rd_rel->relpersistence, + buf = ReadBuffer_common(reln->rd_smgr, RelationGetPersistence(reln), forkNum, blockNum, mode, strategy, &hit); if (hit) pgstat_count_buffer_hit(reln); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index c813779..3994b8c 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -987,7 +987,7 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) relation->rd_isnailed = false; relation->rd_createSubid = InvalidSubTransactionId; relation->rd_newRelfilenodeSubid = InvalidSubTransactionId; - switch (relation->rd_rel->relpersistence) + switch (RelationGetPersistence(relation)) { case RELPERSISTENCE_UNLOGGED: case RELPERSISTENCE_PERMANENT: @@ -1023,7 +1023,7 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) break; default: elog(ERROR, "invalid relpersistence: %c", - relation->rd_rel->relpersistence); + RelationGetPersistence(relation)); break; } @@ -1612,7 +1612,7 @@ formrdesc(const char *relationName, Oid relationReltype, relation->rd_rel->reltablespace = GLOBALTABLESPACE_OID; /* formrdesc is used only for permanent relations */ - relation->rd_rel->relpersistence = RELPERSISTENCE_PERMANENT; + RelationGetPersistence(relation) = RELPERSISTENCE_PERMANENT; /* ... and they're always populated, too */ relation->rd_rel->relispopulated = true; @@ -3023,7 +3023,7 @@ RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, /* Allocate a new relfilenode */ newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace, NULL, - relation->rd_rel->relpersistence); + RelationGetPersistence(relation)); /* * Get a writable copy of the pg_class tuple for the given relation. @@ -3046,7 +3046,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, RelationGetPersistence(relation)); smgrclosenode(newrnode); /* diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 198b98f..24fd3b6 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -428,6 +428,13 @@ typedef struct ViewOptions } while (0) /* + * RelationGetPersistence + * Get relation persistence + */ +#define RelationGetPersistence(relation) \ + ((relation)->rd_rel->relpersistence) + +/* * RelationNeedsWAL * True if relation needs WAL. */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers