1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-29 16:21:20 +03:00

Fix miserable coding in pg_stat_get_activity().

Commit dd1a3bccc replaced a test on whether a subroutine returned a
null pointer with a test on whether &pointer->backendStatus was null.
This accidentally failed to fail, at least on common compilers, because
backendStatus is the first field in the struct; but it was surely trouble
waiting to happen.  Commit f91feba87 then messed things up further,
changing the logic to

	local_beentry = pgstat_fetch_stat_local_beentry(curr_backend);
	if (!local_beentry)
		continue;
	beentry = &local_beentry->backendStatus;
	if (!beentry)
	{

where the second "if" is now dead code, so that the intended behavior of
printing a row with "<backend information not available>" cannot occur.

I suspect this is all moot because pgstat_fetch_stat_local_beentry
will never actually return null in this function's usage, but it's still
very poor coding.  Repair back to 9.4 where the original problem was
introduced.
This commit is contained in:
Tom Lane 2016-09-10 13:49:04 -04:00
parent 8778da2af0
commit fb7ed3889f

View File

@ -633,15 +633,13 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
{
/* Get specific pid slot */
local_beentry = pgstat_fetch_stat_local_beentry(*(int *) (funcctx->user_fctx));
beentry = &local_beentry->backendStatus;
}
else
{
/* Get the next one in the list */
local_beentry = pgstat_fetch_stat_local_beentry(funcctx->call_cntr + 1); /* 1-based index */
beentry = &local_beentry->backendStatus;
}
if (!beentry)
if (!local_beentry)
{
int i;
@ -655,6 +653,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
}
beentry = &local_beentry->backendStatus;
/* Values available to all callers */
values[0] = ObjectIdGetDatum(beentry->st_databaseid);
values[1] = Int32GetDatum(beentry->st_procpid);