From e16d102a4849df97383a853fba5c7dc7194c2dd6 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Wed, 21 Oct 2026 11:10:52 -0700 Subject: [PATCH] Reject currtid2() on unlogged tables during recovery. Commit 1e707d32564 made COPY TO report a proper error for unlogged tables during recovery. currtid2() has the same problem: it reads the table directly without going through the planner, so on a standby it failed with a low-level error for an unlogged table: ERROR: could not open file "base/5/16384": No such file or directory Check for this case and report the same error as SELECT. No test is added, as currtid2() is an undocumented internal function. Backpatch to all supported versions, like commit 1e707d32564. Reported-by: Masahiko Sawada Author: Jim Jones Discussion: https://postgr.es/m/CAD21AoDNa7pL760_23AN_wYPMkWXCt+Kw0_vJAcci4R5DoCQGg@mail.gmail.com Backpatch-through: 14 --- src/backend/utils/adt/tid.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index e9f1fc706f8..8387e0bf591 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -23,6 +23,7 @@ #include "access/heapam.h" #include "access/sysattr.h" #include "access/tableam.h" +#include "access/xlog.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "common/hashfn.h" @@ -306,6 +307,12 @@ currtid_internal(Relation rel, ItemPointer tid) get_namespace_name(RelationGetNamespace(rel)), RelationGetRelationName(rel)); + /* Temporary and unlogged relations are inaccessible during recovery. */ + if (!RelationIsPermanent(rel) && RecoveryInProgress()) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary or unlogged relations during recovery"))); + ItemPointerCopy(tid, result); snapshot = RegisterSnapshot(GetLatestSnapshot());