From 702f218cb6330a348bf85452c3d3c2832d9831e8 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Wed, 21 Oct 2026 11:10:38 -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 9257886f1da..0afdbe3ac52 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -22,6 +22,7 @@ #include "access/sysattr.h" #include "access/table.h" #include "access/tableam.h" +#include "access/xlog.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "common/hashfn.h" @@ -346,6 +347,12 @@ currtid_internal(Relation rel, const ItemPointerData *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());