Commit 4c0000b8 authored by Andres Freund's avatar Andres Freund

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
parent 5b2526c8
...@@ -685,50 +685,17 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -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) ...@@ -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); ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment