diff options
Diffstat (limited to 'src/backend/utils/cache/relcache.c')
-rw-r--r-- | src/backend/utils/cache/relcache.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index d1ae761b3f6..9f54a9e72b7 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -371,14 +371,13 @@ ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic) pg_class_desc = table_open(RelationRelationId, AccessShareLock); /* - * The caller might need a tuple that's newer than the one the historic - * snapshot; currently the only case requiring to do so is looking up the - * relfilenumber of non mapped system relations during decoding. That - * snapshot can't change in the midst of a relcache build, so there's no - * need to register the snapshot. + * The caller might need a tuple that's newer than what's visible to the + * historic snapshot; currently the only case requiring to do so is + * looking up the relfilenumber of non mapped system relations during + * decoding. */ if (force_non_historic) - snapshot = GetNonHistoricCatalogSnapshot(RelationRelationId); + snapshot = RegisterSnapshot(GetNonHistoricCatalogSnapshot(RelationRelationId)); pg_class_scan = systable_beginscan(pg_class_desc, ClassOidIndexId, indexOK && criticalRelcachesBuilt, @@ -395,6 +394,10 @@ ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic) /* all done */ systable_endscan(pg_class_scan); + + if (snapshot) + UnregisterSnapshot(snapshot); + table_close(pg_class_desc, AccessShareLock); return pg_class_tuple; |