Handle EEOP_FUNCEXPR_[STRICT_]FUSAGE out of line.
This isn't a very common op, and it doesn't seem worth duplicating for JIT. Author: Andres Freund
This commit is contained in:
parent
5b2526c838
commit
4c0000b839
@ -685,50 +685,17 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
|
||||
|
||||
EEO_CASE(EEOP_FUNCEXPR_FUSAGE)
|
||||
{
|
||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
||||
PgStat_FunctionCallUsage fcusage;
|
||||
Datum d;
|
||||
|
||||
pgstat_init_function_usage(fcinfo, &fcusage);
|
||||
|
||||
fcinfo->isnull = false;
|
||||
d = op->d.func.fn_addr(fcinfo);
|
||||
*op->resvalue = d;
|
||||
*op->resnull = fcinfo->isnull;
|
||||
|
||||
pgstat_end_function_usage(&fcusage, true);
|
||||
/* not common enough to inline */
|
||||
ExecEvalFuncExprFusage(state, op, econtext);
|
||||
|
||||
EEO_NEXT();
|
||||
}
|
||||
|
||||
EEO_CASE(EEOP_FUNCEXPR_STRICT_FUSAGE)
|
||||
{
|
||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
||||
PgStat_FunctionCallUsage fcusage;
|
||||
bool *argnull = fcinfo->argnull;
|
||||
int argno;
|
||||
Datum d;
|
||||
/* not common enough to inline */
|
||||
ExecEvalFuncExprStrictFusage(state, op, econtext);
|
||||
|
||||
/* strict function, so check for NULL args */
|
||||
for (argno = 0; argno < op->d.func.nargs; argno++)
|
||||
{
|
||||
if (argnull[argno])
|
||||
{
|
||||
*op->resnull = true;
|
||||
goto strictfail_fusage;
|
||||
}
|
||||
}
|
||||
|
||||
pgstat_init_function_usage(fcinfo, &fcusage);
|
||||
|
||||
fcinfo->isnull = false;
|
||||
d = op->d.func.fn_addr(fcinfo);
|
||||
*op->resvalue = d;
|
||||
*op->resnull = fcinfo->isnull;
|
||||
|
||||
pgstat_end_function_usage(&fcusage, true);
|
||||
|
||||
strictfail_fusage:
|
||||
EEO_NEXT();
|
||||
}
|
||||
|
||||
@ -2207,6 +2174,61 @@ ExecEvalStepOp(ExprState *state, ExprEvalStep *op)
|
||||
* Out-of-line helper functions for complex instructions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Evaluate EEOP_FUNCEXPR_FUSAGE
|
||||
*/
|
||||
void
|
||||
ExecEvalFuncExprFusage(ExprState *state, ExprEvalStep *op,
|
||||
ExprContext *econtext)
|
||||
{
|
||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
||||
PgStat_FunctionCallUsage fcusage;
|
||||
Datum d;
|
||||
|
||||
pgstat_init_function_usage(fcinfo, &fcusage);
|
||||
|
||||
fcinfo->isnull = false;
|
||||
d = op->d.func.fn_addr(fcinfo);
|
||||
*op->resvalue = d;
|
||||
*op->resnull = fcinfo->isnull;
|
||||
|
||||
pgstat_end_function_usage(&fcusage, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Evaluate EEOP_FUNCEXPR_STRICT_FUSAGE
|
||||
*/
|
||||
void
|
||||
ExecEvalFuncExprStrictFusage(ExprState *state, ExprEvalStep *op,
|
||||
ExprContext *econtext)
|
||||
{
|
||||
|
||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
||||
PgStat_FunctionCallUsage fcusage;
|
||||
bool *argnull = fcinfo->argnull;
|
||||
int argno;
|
||||
Datum d;
|
||||
|
||||
/* strict function, so check for NULL args */
|
||||
for (argno = 0; argno < op->d.func.nargs; argno++)
|
||||
{
|
||||
if (argnull[argno])
|
||||
{
|
||||
*op->resnull = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pgstat_init_function_usage(fcinfo, &fcusage);
|
||||
|
||||
fcinfo->isnull = false;
|
||||
d = op->d.func.fn_addr(fcinfo);
|
||||
*op->resvalue = d;
|
||||
*op->resnull = fcinfo->isnull;
|
||||
|
||||
pgstat_end_function_usage(&fcusage, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Evaluate a PARAM_EXEC parameter.
|
||||
*
|
||||
|
@ -690,6 +690,10 @@ extern void CheckExprStillValid(ExprState *state, ExprContext *econtext);
|
||||
* execExprInterp.c, because that allows them to be used by other methods of
|
||||
* expression evaluation, reducing code duplication.
|
||||
*/
|
||||
extern void ExecEvalFuncExprFusage(ExprState *state, ExprEvalStep *op,
|
||||
ExprContext *econtext);
|
||||
extern void ExecEvalFuncExprStrictFusage(ExprState *state, ExprEvalStep *op,
|
||||
ExprContext *econtext);
|
||||
extern void ExecEvalParamExec(ExprState *state, ExprEvalStep *op,
|
||||
ExprContext *econtext);
|
||||
extern void ExecEvalParamExecParams(Bitmapset *params, EState *estate);
|
||||
|
Loading…
x
Reference in New Issue
Block a user