diff options
Diffstat (limited to 'src/backend/executor/nodeWindowAgg.c')
-rw-r--r-- | src/backend/executor/nodeWindowAgg.c | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 7ae56074ca8..731391f1907 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -241,10 +241,9 @@ advance_windowaggregate(WindowAggState *winstate, WindowStatePerFunc perfuncstate, WindowStatePerAgg peraggstate) { + LOCAL_FCINFO(fcinfo, FUNC_MAX_ARGS); WindowFuncExprState *wfuncstate = perfuncstate->wfuncstate; int numArguments = perfuncstate->numArguments; - FunctionCallInfoData fcinfodata; - FunctionCallInfo fcinfo = &fcinfodata; Datum newVal; ListCell *arg; int i; @@ -273,8 +272,8 @@ advance_windowaggregate(WindowAggState *winstate, { 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++; } @@ -287,7 +286,7 @@ advance_windowaggregate(WindowAggState *winstate, */ for (i = 1; i <= numArguments; i++) { - if (fcinfo->argnull[i]) + if (fcinfo->args[i].isnull) { MemoryContextSwitchTo(oldContext); return; @@ -306,7 +305,7 @@ advance_windowaggregate(WindowAggState *winstate, if (peraggstate->transValueCount == 0 && peraggstate->transValueIsNull) { MemoryContextSwitchTo(peraggstate->aggcontext); - peraggstate->transValue = datumCopy(fcinfo->arg[1], + peraggstate->transValue = datumCopy(fcinfo->args[1].value, peraggstate->transtypeByVal, peraggstate->transtypeLen); peraggstate->transValueIsNull = false; @@ -339,8 +338,8 @@ advance_windowaggregate(WindowAggState *winstate, numArguments + 1, perfuncstate->winCollation, (void *) winstate, NULL); - fcinfo->arg[0] = peraggstate->transValue; - fcinfo->argnull[0] = peraggstate->transValueIsNull; + fcinfo->args[0].value = peraggstate->transValue; + fcinfo->args[0].isnull = peraggstate->transValueIsNull; winstate->curaggcontext = peraggstate->aggcontext; newVal = FunctionCallInvoke(fcinfo); winstate->curaggcontext = NULL; @@ -418,10 +417,9 @@ advance_windowaggregate_base(WindowAggState *winstate, WindowStatePerFunc perfuncstate, WindowStatePerAgg peraggstate) { + LOCAL_FCINFO(fcinfo, FUNC_MAX_ARGS); WindowFuncExprState *wfuncstate = perfuncstate->wfuncstate; int numArguments = perfuncstate->numArguments; - FunctionCallInfoData fcinfodata; - FunctionCallInfo fcinfo = &fcinfodata; Datum newVal; ListCell *arg; int i; @@ -450,8 +448,8 @@ advance_windowaggregate_base(WindowAggState *winstate, { 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++; } @@ -464,7 +462,7 @@ advance_windowaggregate_base(WindowAggState *winstate, */ for (i = 1; i <= numArguments; i++) { - if (fcinfo->argnull[i]) + if (fcinfo->args[i].isnull) { MemoryContextSwitchTo(oldContext); return true; @@ -510,8 +508,8 @@ advance_windowaggregate_base(WindowAggState *winstate, numArguments + 1, perfuncstate->winCollation, (void *) winstate, NULL); - fcinfo->arg[0] = peraggstate->transValue; - fcinfo->argnull[0] = peraggstate->transValueIsNull; + fcinfo->args[0].value = peraggstate->transValue; + fcinfo->args[0].isnull = peraggstate->transValueIsNull; winstate->curaggcontext = peraggstate->aggcontext; newVal = FunctionCallInvoke(fcinfo); winstate->curaggcontext = NULL; @@ -591,30 +589,31 @@ finalize_windowaggregate(WindowAggState *winstate, */ if (OidIsValid(peraggstate->finalfn_oid)) { + LOCAL_FCINFO(fcinfo, FUNC_MAX_ARGS); int numFinalArgs = peraggstate->numFinalArgs; - FunctionCallInfoData fcinfo; bool anynull; int i; - InitFunctionCallInfoData(fcinfo, &(peraggstate->finalfn), + InitFunctionCallInfoData(fcinfodata.fcinfo, &(peraggstate->finalfn), numFinalArgs, perfuncstate->winCollation, (void *) winstate, NULL); - fcinfo.arg[0] = MakeExpandedObjectReadOnly(peraggstate->transValue, - peraggstate->transValueIsNull, - peraggstate->transtypeLen); - fcinfo.argnull[0] = peraggstate->transValueIsNull; + fcinfo->args[0].value = + MakeExpandedObjectReadOnly(peraggstate->transValue, + peraggstate->transValueIsNull, + peraggstate->transtypeLen); + fcinfo->args[0].isnull = peraggstate->transValueIsNull; anynull = peraggstate->transValueIsNull; /* Fill any remaining argument positions with nulls */ for (i = 1; i < numFinalArgs; i++) { - fcinfo.arg[i] = (Datum) 0; - fcinfo.argnull[i] = true; + fcinfo->args[i].value = (Datum) 0; + fcinfo->args[i].isnull = true; anynull = true; } - if (fcinfo.flinfo->fn_strict && anynull) + if (fcinfo->flinfo->fn_strict && anynull) { /* don't call a strict function with NULL inputs */ *result = (Datum) 0; @@ -623,9 +622,9 @@ finalize_windowaggregate(WindowAggState *winstate, else { winstate->curaggcontext = peraggstate->aggcontext; - *result = FunctionCallInvoke(&fcinfo); + *result = FunctionCallInvoke(fcinfo); winstate->curaggcontext = NULL; - *isnull = fcinfo.isnull; + *isnull = fcinfo->isnull; } } else @@ -1032,7 +1031,7 @@ static void eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate, Datum *result, bool *isnull) { - FunctionCallInfoData fcinfo; + LOCAL_FCINFO(fcinfo, FUNC_MAX_ARGS); MemoryContext oldContext; oldContext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_tuple_memory); @@ -1043,24 +1042,25 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate, * implementations to support varying numbers of arguments. The real info * goes through the WindowObject, which is passed via fcinfo->context. */ - InitFunctionCallInfoData(fcinfo, &(perfuncstate->flinfo), + InitFunctionCallInfoData(*fcinfo, &(perfuncstate->flinfo), perfuncstate->numArguments, perfuncstate->winCollation, (void *) perfuncstate->winobj, NULL); /* Just in case, make all the regular argument slots be null */ - memset(fcinfo.argnull, true, perfuncstate->numArguments); + for (int argno = 0; argno < perfuncstate->numArguments; argno++) + fcinfo->args[argno].isnull = true; /* Window functions don't have a current aggregate context, either */ winstate->curaggcontext = NULL; - *result = FunctionCallInvoke(&fcinfo); - *isnull = fcinfo.isnull; + *result = FunctionCallInvoke(fcinfo); + *isnull = fcinfo->isnull; /* * Make sure pass-by-ref data is allocated in the appropriate context. (We * need this in case the function returns a pointer into some short-lived * tuple, as is entirely possible.) */ - if (!perfuncstate->resulttypeByVal && !fcinfo.isnull && + if (!perfuncstate->resulttypeByVal && !fcinfo->isnull && !MemoryContextContains(CurrentMemoryContext, DatumGetPointer(*result))) *result = datumCopy(*result, |