pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
{
FmgrInfo *fmgr_info = fcinfo->flinfo;
- MemoryContext oldcxt;
int32 result;
- if (fcinfo->resultinfo == NULL)
- elog(ERROR, "called in context that does not accept a set result (1)");
- if (!IsA(fcinfo->resultinfo, ReturnSetInfo))
- elog(ERROR, "called in context that does not accept a set result (2)");
+ if (fcinfo->resultinfo == NULL ||
+ !IsA(fcinfo->resultinfo, ReturnSetInfo))
+ elog(ERROR, "pg_stat_get_backend_idset: called in context that does not accept a set result");
if (fmgr_info->fn_extra == NULL)
{
if (fmgr_info->fn_mcxt == NULL)
elog(ERROR, "No function memory context in set-function");
-
- oldcxt = MemoryContextSwitchTo(fmgr_info->fn_mcxt);
- fmgr_info->fn_extra = palloc(sizeof(int32) * 2);
- ((int32 *)(fmgr_info->fn_extra))[0] = 0;
- ((int32 *)(fmgr_info->fn_extra))[1] =
- (int32)pgstat_fetch_stat_numbackends();
- MemoryContextSwitchTo(oldcxt);
+ fmgr_info->fn_extra = MemoryContextAlloc(fmgr_info->fn_mcxt,
+ 2 * sizeof(int));
+ ((int *)(fmgr_info->fn_extra))[0] = 0;
+ ((int *)(fmgr_info->fn_extra))[1] = pgstat_fetch_stat_numbackends();
}
- ((int32 *)(fmgr_info->fn_extra))[0] += 1;
- result = ((int32 *)(fmgr_info->fn_extra))[0];
-
+ ((int *)(fmgr_info->fn_extra))[0] += 1;
+ result = ((int *)(fmgr_info->fn_extra))[0];
- if (result > ((int32 *)(fmgr_info->fn_extra))[1])
+ if (result > ((int *)(fmgr_info->fn_extra))[1])
{
+ pfree(fmgr_info->fn_extra);
+ fmgr_info->fn_extra = NULL;
((ReturnSetInfo *)(fcinfo->resultinfo))->isDone = ExprEndResult;
PG_RETURN_NULL();
}