From 9ab2734d2b2246db3ca16e06ec560ad0a33621e9 Mon Sep 17 00:00:00 2001
From: Jim Jones <jim.jones@uni-muenster.de>
Date: Wed, 4 Nov 2026 07:24:12 +0100
Subject: [PATCH v4 6/6] pg_freespacemap: Reject relations whose free space map
 cannot be read

pg_freespace() returned 0 for unlogged relations during recovery and
for temporary tables of other sessions without a free space map fork,
because a missing free space map reads as no free space.  Report an
error instead.

Author: Surya Poondla <suryapoondla4@gmail.com>
Reviewed-by: Jim Jones <jim.jones@uni-muenster.de>
---
 contrib/pg_freespacemap/pg_freespacemap.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c
index 610fc90b5ba..4952468695d 100644
--- a/contrib/pg_freespacemap/pg_freespacemap.c
+++ b/contrib/pg_freespacemap/pg_freespacemap.c
@@ -9,6 +9,7 @@
 #include "postgres.h"
 
 #include "access/relation.h"
+#include "access/xlog.h"
 #include "fmgr.h"
 #include "storage/freespace.h"
 #include "utils/rel.h"
@@ -41,6 +42,22 @@ pg_freespace(PG_FUNCTION_ARGS)
 						RelationGetRelationName(rel)),
 				 errdetail_relkind_not_supported(rel->rd_rel->relkind)));
 
+	/*
+	 * Reject attempts to read non-local temporary relations; we would be
+	 * likely to get wrong data since we have no visibility into the owning
+	 * session's local buffers.
+	 */
+	if (RELATION_IS_OTHER_TEMP(rel))
+		ereport(ERROR,
+				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+				 errmsg("cannot access temporary tables of other sessions")));
+
+	/* 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")));
+
 	if (blkno < 0 || blkno > MaxBlockNumber)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-- 
2.56.0

