mirror of
https://github.com/postgres/postgres.git
synced 2025-06-22 02:52:08 +03:00
Paper over bt_metap() oldest_xact bug in backbranches.
The data types that contrib/pageinspect's bt_metap() function were
declared to return as OUT arguments were wrong in some cases. In
particular, the oldest_xact column (a TransactionId/xid field) was
declared integer/int4 within the pageinspect extension's sql file. This
led to errors when an oldest_xact value that exceeded 2^31-1 was
encountered.
We cannot fix the declaration on Postgres 11 or 12. All we can do is
ameliorate the problem. Use "%d" instead of "%u" to format the output
of the oldest_xact value. This makes the C code match the declaration,
suppressing unhelpful error messages that might otherwise make
bt_metap() totally unusable. A bogus negative oldest_xact value will be
displayed instead of raising an error.
This commit addresses the same issue as master branch commit 691e8b2e18
,
which actually fixed the problem. Backpatch to the 11 and 12 branches
only, since they are the only branches (other than master) that have
oldest_xact. All of the other problematic columns already display bogus
output for out of range values.
Reported-By: Victor Yegorov
Bug: #16285
Discussion: https://postgr.es/m/20200309223557.aip5n6ewln4ixbbi@alap3.anarazel.de
Backpatch: 11 and 12 only
This commit is contained in:
@ -563,7 +563,12 @@ bt_metap(PG_FUNCTION_ARGS)
|
||||
*/
|
||||
if (metad->btm_version >= BTREE_NOVAC_VERSION)
|
||||
{
|
||||
values[j++] = psprintf("%u", metad->btm_oldest_btpo_xact);
|
||||
/*
|
||||
* kludge: btm_oldest_btpo_xact is declared as int4, which is wrong.
|
||||
* We should at least avoid raising an error when its value happens to
|
||||
* exceed PG_INT32_MAX, though.
|
||||
*/
|
||||
values[j++] = psprintf("%d", (int) metad->btm_oldest_btpo_xact);
|
||||
values[j++] = psprintf("%f", metad->btm_last_cleanup_num_heap_tuples);
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user