From dcc2eb693c70936627e8c9af32b93bcc35d6cd5e Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Mon, 2 Mar 2026 04:21:02 +1300
Subject: [PATCH v2 15/19] Use stack buffer in some FDW code.

Mechanical changes to temporary datum and null arrays.
---
 contrib/file_fdw/file_fdw.c         | 11 +++++++----
 contrib/postgres_fdw/postgres_fdw.c |  9 +++++++--
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c
index 33a37d832ce..a6958d6a4c0 100644
--- a/contrib/file_fdw/file_fdw.c
+++ b/contrib/file_fdw/file_fdw.c
@@ -40,6 +40,7 @@
 #include "utils/memutils.h"
 #include "utils/rel.h"
 #include "utils/sampling.h"
+#include "utils/stack_buffer.h"
 #include "utils/varlena.h"
 
 PG_MODULE_MAGIC_EXT(
@@ -1202,12 +1203,14 @@ file_acquire_sample_rows(Relation onerel, int elevel,
 	MemoryContext oldcontext = CurrentMemoryContext;
 	MemoryContext tupcontext;
 
+	DECLARE_STACK_BUFFER();
+
 	Assert(onerel);
 	Assert(targrows > 0);
 
 	tupDesc = RelationGetDescr(onerel);
-	values = (Datum *) palloc(tupDesc->natts * sizeof(Datum));
-	nulls = (bool *) palloc(tupDesc->natts * sizeof(bool));
+	values = stack_buffer_alloc_array(Datum, tupDesc->natts);
+	nulls = stack_buffer_alloc_array(bool, tupDesc->natts);
 
 	/* Fetch options of foreign table */
 	fileGetOptions(RelationGetRelid(onerel), &filename, &is_program, &options);
@@ -1324,8 +1327,8 @@ file_acquire_sample_rows(Relation onerel, int elevel,
 
 	EndCopyFrom(cstate);
 
-	pfree(values);
-	pfree(nulls);
+	stack_buffer_free(values);
+	stack_buffer_free(nulls);
 
 	/*
 	 * Emit some interesting relation info
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 60d90329a65..c817b718616 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -48,6 +48,7 @@
 #include "utils/rel.h"
 #include "utils/sampling.h"
 #include "utils/selfuncs.h"
+#include "utils/stack_buffer.h"
 
 PG_MODULE_MAGIC_EXT(
 					.name = "postgres_fdw",
@@ -7507,6 +7508,8 @@ make_tuple_from_result_row(PGresult *res,
 	ListCell   *lc;
 	int			j;
 
+	DECLARE_STACK_BUFFER();
+
 	Assert(row < PQntuples(res));
 
 	/*
@@ -7528,8 +7531,8 @@ make_tuple_from_result_row(PGresult *res,
 		tupdesc = fsstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor;
 	}
 
-	values = (Datum *) palloc0(tupdesc->natts * sizeof(Datum));
-	nulls = (bool *) palloc(tupdesc->natts * sizeof(bool));
+	values = stack_buffer_alloc0_array(Datum, tupdesc->natts);
+	nulls = stack_buffer_alloc_array(bool, tupdesc->natts);
 	/* Initialize to nulls for any columns not present in result */
 	memset(nulls, true, tupdesc->natts * sizeof(bool));
 
@@ -7631,6 +7634,8 @@ make_tuple_from_result_row(PGresult *res,
 	HeapTupleHeaderSetCmin(tuple->t_data, InvalidTransactionId);
 
 	/* Clean up */
+	stack_buffer_free(values);
+	stack_buffer_free(nulls);
 	MemoryContextReset(temp_context);
 
 	return tuple;
-- 
2.53.0

