summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2020-03-11 14:15:00 -0700
committerPeter Geoghegan <pg@bowt.ie>2020-03-11 14:15:00 -0700
commitc788115b5eb50d666023aa6f6e7faee21288401c (patch)
tree75f78c858aa3920840e19ec31bd4e5a0621f5cf7
parente70187c9b47cc1035a42196e62c4b5958f122a77 (diff)
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
-rw-r--r--contrib/pageinspect/btreefuncs.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c
index 90acf6a4b6d..439d706edee 100644
--- a/contrib/pageinspect/btreefuncs.c
+++ b/contrib/pageinspect/btreefuncs.c
@@ -562,7 +562,12 @@ bt_metap(PG_FUNCTION_ARGS)
*/
if (metad->btm_version == BTREE_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