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:
parent
8778da2af0
commit
fb7ed3889f
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user