On 2020-Apr-05, Tom Lane wrote: > What I wish we had was alloca(), so you don't need a FUNC_MAX_ARGS-sized > array to parse a two-argument function call. Too bad C99 didn't add > that. (But some sniffing around suggests that an awful lot of systems > have it anyway ... even MSVC. Hmmm.)
Isn't it the case that you can create an inner block with a constant whose size is determined by a containing block's variable? I mean as in the attached, which refuses to compile because of our -Werror=vla -- but if I remove it, it compiles fine and works in my system. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 9c3b6ad916..415ea17c68 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -103,7 +103,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Node *first_arg = NULL; int nargs; int nargsplusdefs; - Oid actual_arg_types[FUNC_MAX_ARGS]; Oid *declared_arg_types; List *argnames; List *argdefaults; @@ -115,6 +114,9 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, char aggkind = 0; ParseCallbackState pcbstate; + { + Oid actual_arg_types[list_length(fargs)]; + /* * If there's an aggregate filter, transform it using transformWhereClause */ @@ -888,6 +890,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, /* if it returns a set, remember it for error checks at higher levels */ if (retset) pstate->p_last_srf = retval; + } return retval; }