From a338d654614f897ccb58eaa8a6171abdb7dc8dff Mon Sep 17 00:00:00 2001 From: Alvaro Herrera <alvherre@alvh.no-ip.org> Date: Fri, 25 Feb 2011 19:04:25 -0300 Subject: [PATCH] Fix pageinspect's heap_page_item to return infomasks as 32 bit values HeapTupleHeader's t_infomask and t_infomask2 are defined as 16-bit unsigned integers, so when the 16th bit was set, heap_page_item was returning them as negative values, which was ugly. The change to pageinspect--unpackaged--1.0.sql allows a module upgraded from 9.0 to be cleanly updated from the previous definition. --- contrib/pageinspect/heapfuncs.c | 4 ++-- .../pageinspect--unpackaged--1.0.sql | 20 ++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 49a2f911200..20bca0dc539 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -170,8 +170,8 @@ heap_page_items(PG_FUNCTION_ARGS) values[5] = UInt32GetDatum(HeapTupleHeaderGetXmax(tuphdr)); values[6] = UInt32GetDatum(HeapTupleHeaderGetRawCommandId(tuphdr)); /* shared with xvac */ values[7] = PointerGetDatum(&tuphdr->t_ctid); - values[8] = UInt16GetDatum(tuphdr->t_infomask2); - values[9] = UInt16GetDatum(tuphdr->t_infomask); + values[8] = UInt32GetDatum(tuphdr->t_infomask2); + values[9] = UInt32GetDatum(tuphdr->t_infomask); values[10] = UInt8GetDatum(tuphdr->t_hoff); /* diff --git a/contrib/pageinspect/pageinspect--unpackaged--1.0.sql b/contrib/pageinspect/pageinspect--unpackaged--1.0.sql index a9d1b52a426..7d4feaf034a 100644 --- a/contrib/pageinspect/pageinspect--unpackaged--1.0.sql +++ b/contrib/pageinspect/pageinspect--unpackaged--1.0.sql @@ -1,9 +1,27 @@ /* contrib/pageinspect/pageinspect--unpackaged--1.0.sql */ +DROP FUNCTION heap_page_items(bytea); +CREATE FUNCTION heap_page_items(IN page bytea, + OUT lp smallint, + OUT lp_off smallint, + OUT lp_flags smallint, + OUT lp_len smallint, + OUT t_xmin xid, + OUT t_xmax xid, + OUT t_field3 int4, + OUT t_ctid tid, + OUT t_infomask2 integer, + OUT t_infomask integer, + OUT t_hoff smallint, + OUT t_bits text, + OUT t_oid oid) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'heap_page_items' +LANGUAGE C STRICT; + ALTER EXTENSION pageinspect ADD function get_raw_page(text,integer); ALTER EXTENSION pageinspect ADD function get_raw_page(text,text,integer); ALTER EXTENSION pageinspect ADD function page_header(bytea); -ALTER EXTENSION pageinspect ADD function heap_page_items(bytea); ALTER EXTENSION pageinspect ADD function bt_metap(text); ALTER EXTENSION pageinspect ADD function bt_page_stats(text,integer); ALTER EXTENSION pageinspect ADD function bt_page_items(text,integer); -- GitLab