From e07593473fad042cfa9da6f5b565443728af7656 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Tue, 10 Mar 2026 17:41:49 +1300
Subject: [PATCH v2 12/19] Use stack buffer in a few places in the parser.

Mechanical C string conversions and a small temporary array.
---
 src/backend/parser/parse_clause.c | 7 +++++--
 src/backend/parser/parse_func.c   | 7 +++++--
 src/backend/parser/parse_type.c   | 7 +++++--
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 06b65d4a605..7360da2b04b 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -45,6 +45,7 @@
 #include "utils/catcache.h"
 #include "utils/lsyscache.h"
 #include "utils/rel.h"
+#include "utils/stack_buffer.h"
 #include "utils/syscache.h"
 
 
@@ -693,6 +694,8 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf)
 	char	  **names;
 	int			colno;
 
+	DECLARE_STACK_BUFFER();
+
 	/*
 	 * Currently we only support XMLTABLE here.  See transformJsonTable() for
 	 * JSON_TABLE support.
@@ -733,7 +736,7 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf)
 	tf->ordinalitycol = -1;
 
 	/* Process column specs */
-	names = palloc_array(char *, list_length(rtf->columns));
+	names = stack_buffer_alloc_array(char *, list_length(rtf->columns));
 
 	colno = 0;
 	foreach(col, rtf->columns)
@@ -825,7 +828,7 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf)
 
 		colno++;
 	}
-	pfree(names);
+	stack_buffer_free(names);
 
 	/* Namespaces, if any, also need to be transformed */
 	if (rtf->namespaces != NIL)
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 24f6745923b..2f63ce55a23 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -32,6 +32,7 @@
 #include "parser/parse_type.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
+#include "utils/stack_buffer.h"
 #include "utils/syscache.h"
 
 
@@ -1759,15 +1760,17 @@ func_get_detail(List *funcname,
 			char	   *str;
 			List	   *defaults;
 
+			DECLARE_STACK_BUFFER();
+
 			/* shouldn't happen, FuncnameGetCandidates messed up */
 			if (best_candidate->ndargs > pform->pronargdefaults)
 				elog(ERROR, "not enough default arguments");
 
 			proargdefaults = SysCacheGetAttrNotNull(PROCOID, ftup,
 													Anum_pg_proc_proargdefaults);
-			str = TextDatumGetCString(proargdefaults);
+			str = stack_buffer_text_datum_to_cstring(proargdefaults);
 			defaults = castNode(List, stringToNode(str));
-			pfree(str);
+			stack_buffer_free(str);
 
 			/* Delete any unused defaults from the returned list */
 			if (best_candidate->argnumbers != NULL)
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index bb7eccde9fd..35234331070 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -24,6 +24,7 @@
 #include "utils/array.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
+#include "utils/stack_buffer.h"
 #include "utils/syscache.h"
 
 static int32 typenameTypeMod(ParseState *pstate, const TypeName *typeName,
@@ -339,6 +340,8 @@ typenameTypeMod(ParseState *pstate, const TypeName *typeName, Type typ)
 	ArrayType  *arrtypmod;
 	ParseCallbackState pcbstate;
 
+	DECLARE_STACK_BUFFER();
+
 	/* Return prespecified typmod if no typmod expressions */
 	if (typeName->typmods == NIL)
 		return typeName->typemod;
@@ -369,7 +372,7 @@ typenameTypeMod(ParseState *pstate, const TypeName *typeName, Type typ)
 	 * Currently, we allow simple numeric constants, string literals, and
 	 * identifiers; possibly this list could be extended.
 	 */
-	datums = palloc_array(Datum, list_length(typeName->typmods));
+	datums = stack_buffer_alloc_array(Datum, list_length(typeName->typmods));
 	n = 0;
 	foreach(l, typeName->typmods)
 	{
@@ -421,7 +424,7 @@ typenameTypeMod(ParseState *pstate, const TypeName *typeName, Type typ)
 
 	cancel_parser_errposition_callback(&pcbstate);
 
-	pfree(datums);
+	stack_buffer_free(datums);
 	pfree(arrtypmod);
 
 	return result;
-- 
2.53.0

