提交 b16a8f49 编写于 作者: T Tom Lane

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.
上级 f00da6d8
......@@ -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();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册