pg_stat_get_backend_idset should reset fmgr_info->fn_extra at end of

execution, so that it restarts correctly if query tree is used again.
This commit is contained in:
Tom Lane 2001-09-30 21:01:39 +00:00
parent f00da6d841
commit b16a8f49a7
1 changed files with 12 additions and 16 deletions

View File

@ -179,33 +179,29 @@ Datum
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();
}