mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
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)
|
pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
FmgrInfo *fmgr_info = fcinfo->flinfo;
|
FmgrInfo *fmgr_info = fcinfo->flinfo;
|
||||||
MemoryContext oldcxt;
|
|
||||||
int32 result;
|
int32 result;
|
||||||
|
|
||||||
if (fcinfo->resultinfo == NULL)
|
if (fcinfo->resultinfo == NULL ||
|
||||||
elog(ERROR, "called in context that does not accept a set result (1)");
|
!IsA(fcinfo->resultinfo, ReturnSetInfo))
|
||||||
if (!IsA(fcinfo->resultinfo, ReturnSetInfo))
|
elog(ERROR, "pg_stat_get_backend_idset: called in context that does not accept a set result");
|
||||||
elog(ERROR, "called in context that does not accept a set result (2)");
|
|
||||||
|
|
||||||
if (fmgr_info->fn_extra == NULL)
|
if (fmgr_info->fn_extra == NULL)
|
||||||
{
|
{
|
||||||
if (fmgr_info->fn_mcxt == NULL)
|
if (fmgr_info->fn_mcxt == NULL)
|
||||||
elog(ERROR, "No function memory context in set-function");
|
elog(ERROR, "No function memory context in set-function");
|
||||||
|
fmgr_info->fn_extra = MemoryContextAlloc(fmgr_info->fn_mcxt,
|
||||||
oldcxt = MemoryContextSwitchTo(fmgr_info->fn_mcxt);
|
2 * sizeof(int));
|
||||||
fmgr_info->fn_extra = palloc(sizeof(int32) * 2);
|
((int *)(fmgr_info->fn_extra))[0] = 0;
|
||||||
((int32 *)(fmgr_info->fn_extra))[0] = 0;
|
((int *)(fmgr_info->fn_extra))[1] = pgstat_fetch_stat_numbackends();
|
||||||
((int32 *)(fmgr_info->fn_extra))[1] =
|
|
||||||
(int32)pgstat_fetch_stat_numbackends();
|
|
||||||
MemoryContextSwitchTo(oldcxt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
((int32 *)(fmgr_info->fn_extra))[0] += 1;
|
((int *)(fmgr_info->fn_extra))[0] += 1;
|
||||||
result = ((int32 *)(fmgr_info->fn_extra))[0];
|
result = ((int *)(fmgr_info->fn_extra))[0];
|
||||||
|
|
||||||
|
if (result > ((int *)(fmgr_info->fn_extra))[1])
|
||||||
if (result > ((int32 *)(fmgr_info->fn_extra))[1])
|
|
||||||
{
|
{
|
||||||
|
pfree(fmgr_info->fn_extra);
|
||||||
|
fmgr_info->fn_extra = NULL;
|
||||||
((ReturnSetInfo *)(fcinfo->resultinfo))->isDone = ExprEndResult;
|
((ReturnSetInfo *)(fcinfo->resultinfo))->isDone = ExprEndResult;
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user