From e07593473fad042cfa9da6f5b565443728af7656 Mon Sep 17 00:00:00 2001 From: Thomas Munro 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