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:
parent
f00da6d841
commit
b16a8f49a7
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user