postgres.git / summary / log / commit / refs

commit    393b449f1a643f5a90a4399dffa3148a94e5beec
Author:   Peter Geoghegan <pg@bowt.ie>
Date:     Wed Mar 11 21:15:02 2020 +0000
First released in: 11.8, 12.3

    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


contrib/pageinspect/btreefuncs.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c index 8d27c9b0f6f..dd15caa44d4 100644 --- a/contrib/pageinspect/btreefuncs.c +++ b/contrib/pageinspect/btreefuncs.c @@ -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 [parent: f977e6dec8a0]