\set page_num 1074261 \set table_name '\'history_uint\'' SELECT :page_num AS page_num, -- note: the first file has no suffix ('', not '.0'), cba to make it print right pg_relation_filepath(:table_name) || '.' || floor(:page_num * 8 / (1024 * 1024)) AS file, '0x' || to_hex(:page_num * 8 % (1024 * 1024) * 1024 + 24 + (4 * (lp - 1))) AS file_off, -- endian swap regexp_replace( -- re-pack ItemIdData, see src/include/storage/itemid.h lpad(to_hex((lp_len::int << 17) | (lp_flags::int << 15) | lp_off::int), 8, '0'), '(..)(..)(..)(..)', '\4\3\2\1') AS ItemItData_bytes, ItemIdData.*, PageHeaderData.* FROM heap_page_items(get_raw_page(:table_name, :page_num)) AS ItemIdData, page_header(get_raw_page(:table_name, :page_num)) AS PageHeaderData WHERE -- this mirrors the sanity check postgres does internally ItemIdData.lp_len > 0 AND -- item has data ( ItemIdData.lp_off < PageHeaderData.upper OR -- but offset is out of range ItemIdData.lp_off >= PageHeaderData.special );