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)
|
EEO_CASE(EEOP_FUNCEXPR_FUSAGE)
|
||||||
{
|
{
|
||||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
/* not common enough to inline */
|
||||||
PgStat_FunctionCallUsage fcusage;
|
ExecEvalFuncExprFusage(state, op, econtext);
|
||||||
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);
|
|
||||||
|
|
||||||
EEO_NEXT();
|
EEO_NEXT();
|
||||||
}
|
}
|
||||||
|
|
||||||
EEO_CASE(EEOP_FUNCEXPR_STRICT_FUSAGE)
|
EEO_CASE(EEOP_FUNCEXPR_STRICT_FUSAGE)
|
||||||
{
|
{
|
||||||
FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
|
/* not common enough to inline */
|
||||||
PgStat_FunctionCallUsage fcusage;
|
ExecEvalFuncExprStrictFusage(state, op, econtext);
|
||||||
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;
|
|
||||||
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();
|
EEO_NEXT();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2207,6 +2174,61 @@ ExecEvalStepOp(ExprState *state, ExprEvalStep *op)
|
|||||||
* Out-of-line helper functions for complex instructions.
|
* 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.
|
* 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
|
* execExprInterp.c, because that allows them to be used by other methods of
|
||||||
* expression evaluation, reducing code duplication.
|
* 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,
|
extern void ExecEvalParamExec(ExprState *state, ExprEvalStep *op,
|
||||||
ExprContext *econtext);
|
ExprContext *econtext);
|
||||||
extern void ExecEvalParamExecParams(Bitmapset *params, EState *estate);
|
extern void ExecEvalParamExecParams(Bitmapset *params, EState *estate);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user