aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execSRF.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execSRF.c')
-rw-r--r--src/backend/executor/execSRF.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/backend/executor/execSRF.c b/src/backend/executor/execSRF.c
index 0c086c52904..265250186a1 100644
--- a/src/backend/executor/execSRF.c
+++ b/src/backend/executor/execSRF.c
@@ -109,7 +109,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
Oid funcrettype;
bool returnsTuple;
bool returnsSet = false;
- FunctionCallInfoData fcinfo;
+ FunctionCallInfo fcinfo;
PgStat_FunctionCallUsage fcusage;
ReturnSetInfo rsinfo;
HeapTupleData tmptup;
@@ -141,6 +141,8 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
rsinfo.setResult = NULL;
rsinfo.setDesc = NULL;
+ fcinfo = palloc(SizeForFunctionCallInfo(list_length(setexpr->args)));
+
/*
* Normally the passed expression tree will be a SetExprState, since the
* grammar only allows a function call at the top level of a table
@@ -157,9 +159,9 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
* This path is similar to ExecMakeFunctionResultSet.
*/
returnsSet = setexpr->funcReturnsSet;
- InitFunctionCallInfoData(fcinfo, &(setexpr->func),
+ InitFunctionCallInfoData(*fcinfo, &(setexpr->func),
list_length(setexpr->args),
- setexpr->fcinfo_data.fncollation,
+ setexpr->fcinfo->fncollation,
NULL, (Node *) &rsinfo);
/*
@@ -174,7 +176,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
*/
MemoryContextReset(argContext);
oldcontext = MemoryContextSwitchTo(argContext);
- ExecEvalFuncArgs(&fcinfo, setexpr->args, econtext);
+ ExecEvalFuncArgs(fcinfo, setexpr->args, econtext);
MemoryContextSwitchTo(oldcontext);
/*
@@ -186,9 +188,9 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
{
int i;
- for (i = 0; i < fcinfo.nargs; i++)
+ for (i = 0; i < fcinfo->nargs; i++)
{
- if (fcinfo.argnull[i])
+ if (fcinfo->args[i].isnull)
goto no_function_result;
}
}
@@ -196,7 +198,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
else
{
/* Treat setexpr as a generic expression */
- InitFunctionCallInfoData(fcinfo, NULL, 0, InvalidOid, NULL, NULL);
+ InitFunctionCallInfoData(*fcinfo, NULL, 0, InvalidOid, NULL, NULL);
}
/*
@@ -224,11 +226,11 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
/* Call the function or expression one time */
if (!setexpr->elidedFuncState)
{
- pgstat_init_function_usage(&fcinfo, &fcusage);
+ pgstat_init_function_usage(fcinfo, &fcusage);
- fcinfo.isnull = false;
+ fcinfo->isnull = false;
rsinfo.isDone = ExprSingleResult;
- result = FunctionCallInvoke(&fcinfo);
+ result = FunctionCallInvoke(fcinfo);
pgstat_end_function_usage(&fcusage,
rsinfo.isDone != ExprMultipleResult);
@@ -236,7 +238,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
else
{
result =
- ExecEvalExpr(setexpr->elidedFuncState, econtext, &fcinfo.isnull);
+ ExecEvalExpr(setexpr->elidedFuncState, econtext, &fcinfo->isnull);
rsinfo.isDone = ExprSingleResult;
}
@@ -277,7 +279,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
*/
if (returnsTuple)
{
- if (!fcinfo.isnull)
+ if (!fcinfo->isnull)
{
HeapTupleHeader td = DatumGetHeapTupleHeader(result);
@@ -338,7 +340,7 @@ ExecMakeTableFunctionResult(SetExprState *setexpr,
else
{
/* Scalar-type case: just store the function result */
- tuplestore_putvalues(tupstore, tupdesc, &result, &fcinfo.isnull);
+ tuplestore_putvalues(tupstore, tupdesc, &result, &fcinfo->isnull);
}
/*
@@ -547,7 +549,7 @@ restart:
* rows from this SRF have been returned, otherwise ValuePerCall SRFs
* would reference freed memory after the first returned row.
*/
- fcinfo = &fcache->fcinfo_data;
+ fcinfo = fcache->fcinfo;
arguments = fcache->args;
if (!fcache->setArgsValid)
{
@@ -587,7 +589,7 @@ restart:
{
for (i = 0; i < fcinfo->nargs; i++)
{
- if (fcinfo->argnull[i])
+ if (fcinfo->args[i].isnull)
{
callit = false;
break;
@@ -678,6 +680,7 @@ init_sexpr(Oid foid, Oid input_collation, Expr *node,
MemoryContext sexprCxt, bool allowSRF, bool needDescForSRF)
{
AclResult aclresult;
+ size_t numargs = list_length(sexpr->args);
/* Check permission to call function */
aclresult = pg_proc_aclcheck(foid, GetUserId(), ACL_EXECUTE);
@@ -704,8 +707,10 @@ init_sexpr(Oid foid, Oid input_collation, Expr *node,
fmgr_info_set_expr((Node *) sexpr->expr, &(sexpr->func));
/* Initialize the function call parameter struct as well */
- InitFunctionCallInfoData(sexpr->fcinfo_data, &(sexpr->func),
- list_length(sexpr->args),
+ sexpr->fcinfo =
+ (FunctionCallInfo) palloc(SizeForFunctionCallInfo(numargs));
+ InitFunctionCallInfoData(*sexpr->fcinfo, &(sexpr->func),
+ numargs,
input_collation, NULL, NULL);
/* If function returns set, check if that's allowed by caller */
@@ -820,9 +825,9 @@ ExecEvalFuncArgs(FunctionCallInfo fcinfo,
{
ExprState *argstate = (ExprState *) lfirst(arg);
- fcinfo->arg[i] = ExecEvalExpr(argstate,
- econtext,
- &fcinfo->argnull[i]);
+ fcinfo->args[i].value = ExecEvalExpr(argstate,
+ econtext,
+ &fcinfo->args[i].isnull);
i++;
}