diff options
author | Michael Paquier | 2021-07-12 02:05:27 +0000 |
---|---|---|
committer | Michael Paquier | 2021-07-12 02:05:27 +0000 |
commit | 127404fbe28455d6e8183fa58f3b7aefeba8f909 (patch) | |
tree | 3381e6ab834dc7cb4eba384fff52d3aa061aba95 /contrib/pageinspect/rawpage.c | |
parent | 626731db26ae2617e41536678440c3817128a006 (diff) |
pageinspect: Improve page_header() for pages of 32kB
ld_upper, ld_lower, pd_special and the page size have been using
smallint as return type, which could cause those fields to return
negative values in certain cases for builds configures with a page size
of 32kB.
Bump pageinspect to 1.10. page_header() is able to handle the correct
return type of those fields at runtime when using an older version of
the extension, with some tests are added to cover that.
Author: Quan Zongliang
Reviewed-by: Michael Paquier, Bharath Rupireddy
Discussion: https://postgr.es/m/8b8ec36e-61fe-14f9-005d-07bc85aa4eed@yeah.net
Diffstat (limited to 'contrib/pageinspect/rawpage.c')
-rw-r--r-- | contrib/pageinspect/rawpage.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index e9fee73bc43..4bfa346c24a 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -296,10 +296,33 @@ page_header(PG_FUNCTION_ARGS) values[0] = LSNGetDatum(lsn); values[1] = UInt16GetDatum(page->pd_checksum); values[2] = UInt16GetDatum(page->pd_flags); - values[3] = UInt16GetDatum(page->pd_lower); - values[4] = UInt16GetDatum(page->pd_upper); - values[5] = UInt16GetDatum(page->pd_special); - values[6] = UInt16GetDatum(PageGetPageSize(page)); + + /* pageinspect >= 1.10 uses int4 instead of int2 for those fields */ + switch (TupleDescAttr(tupdesc, 3)->atttypid) + { + case INT2OID: + Assert(TupleDescAttr(tupdesc, 4)->atttypid == INT2OID && + TupleDescAttr(tupdesc, 5)->atttypid == INT2OID && + TupleDescAttr(tupdesc, 6)->atttypid == INT2OID); + values[3] = UInt16GetDatum(page->pd_lower); + values[4] = UInt16GetDatum(page->pd_upper); + values[5] = UInt16GetDatum(page->pd_special); + values[6] = UInt16GetDatum(PageGetPageSize(page)); + break; + case INT4OID: + Assert(TupleDescAttr(tupdesc, 4)->atttypid == INT4OID && + TupleDescAttr(tupdesc, 5)->atttypid == INT4OID && + TupleDescAttr(tupdesc, 6)->atttypid == INT4OID); + values[3] = Int32GetDatum(page->pd_lower); + values[4] = Int32GetDatum(page->pd_upper); + values[5] = Int32GetDatum(page->pd_special); + values[6] = Int32GetDatum(PageGetPageSize(page)); + break; + default: + elog(ERROR, "incorrect output types"); + break; + } + values[7] = UInt16GetDatum(PageGetPageLayoutVersion(page)); values[8] = TransactionIdGetDatum(page->pd_prune_xid); |