{"id":14063373,"url":"https://github.com/hollobon/pagevis","last_synced_at":"2025-07-29T15:32:52.552Z","repository":{"id":66945152,"uuid":"51033058","full_name":"hollobon/pagevis","owner":"hollobon","description":"PostgreSQL data page visualisation","archived":false,"fork":false,"pushed_at":"2016-02-05T16:05:08.000Z","size":10,"stargazers_count":30,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-08-13T07:04:50.844Z","etag":null,"topics":["postgresql","postgresql-extension"],"latest_commit_sha":null,"homepage":null,"language":"PLpgSQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hollobon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-03T21:49:00.000Z","updated_at":"2023-09-14T16:14:51.000Z","dependencies_parsed_at":"2023-04-27T19:45:23.811Z","dependency_job_id":null,"html_url":"https://github.com/hollobon/pagevis","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hollobon%2Fpagevis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hollobon%2Fpagevis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hollobon%2Fpagevis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hollobon%2Fpagevis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hollobon","download_url":"https://codeload.github.com/hollobon/pagevis/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228028360,"owners_count":17858322,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["postgresql","postgresql-extension"],"created_at":"2024-08-13T07:03:18.444Z","updated_at":"2024-12-04T01:30:43.044Z","avatar_url":"https://github.com/hollobon.png","language":"PLpgSQL","funding_links":[],"categories":["PLpgSQL"],"sub_categories":[],"readme":"# pagevis\n\nThe pagevis PostgreSQL extension currently contains a single function,\n`show_page`, which returns an ASCII-graphical representation of the contents of\na PostgreSQL database page. It uses the pageinspect extension, which must be\ninstalled first. You must be superuser to call `show_page`, as it uses the\npageinspect `get_raw_page` function.\n\n## Output\n\nThe results of `show_page` are multiple records with a single text column, for\na total of `block_size` characters (default 8192), one representing each byte\non the page.\n\nThe meaning of each character is as shown in this table:\n\n```\n| *Character* | *Meaning*                                     |\n| P           | page header                                   |\n| U           | unused line pointer                           |\n| N           | normal line pointer                           |\n| R           | redirect line pointer                         |\n| D           | dead line pointer                             |\n| (space)     | free space (the \"hole\")                       |\n| [n]         | tuple number (overlaid on tuple header)       |\n| H           | tuple header                                  |\n| #           | tuple data                                    |\n| -           | tuple invisible to current transaction (dead) |\n| .           | inter-tuple padding                           |\n```\n\n## Example\n\n```\n\u003e set role postgres;\nSET\n# create extension pagevis;\nCREATE EXTENSION\n# create table pvtest (a integer);\nCREATE TABLE\n# insert into pvtest select generate_series(1, 500);\nINSERT 0 500\n# select * from pvtest limit 5;\n a\n---\n 1\n 2\n 3\n 4\n 5\n(5 rows)\n\n# select ctid, * from pvtest limit 5;\n ctid  | a\n-------+---\n (0,1) | 1\n (0,2) | 2\n (0,3) | 3\n (0,4) | 4\n (0,5) | 5\n(5 rows)\n\n# select show_page('pvtest', 0, 64);\n                             show_page\n------------------------------------------------------------------\n PPPPPPPPPPPPPPPPPPPPPPPP001N002N003N004N005N006N007N008N009N010N\n 011N012N013N014N015N016N017N018N019N020N021N022N023N024N025N026N\n 027N028N029N030N031N032N033N034N035N036N037N038N039N040N041N042N\n 043N044N045N046N047N048N049N050N051N052N053N054N055N056N057N058N\n 059N060N061N062N063N064N065N066N067N068N069N070N071N072N073N074N\n 075N076N077N078N079N080N081N082N083N084N085N086N087N088N089N090N\n 091N092N093N094N095N096N097N098N099N100N101N102N103N104N105N106N\n 107N108N109N110N111N112N113N114N115N116N117N118N119N120N121N122N\n 123N124N125N126N127N128N129N130N131N132N133N134N135N136N137N138N\n 139N140N141N142N143N144N145N146N147N148N149N150N151N152N153N154N\n 155N156N157N158N159N160N161N162N163N164N165N166N167N168N169N170N\n 171N172N173N174N175N176N177N178N179N180N181N182N183N184N185N186N\n 187N188N189N190N191N192N193N194N195N196N197N198N199N200N201N202N\n 203N204N205N206N207N208N209N210N211N212N213N214N215N216N217N218N\n 219N220N221N222N223N224N225N226N\n [226]HHHHHHHHHHHHHHHHHHH####....[225]HHHHHHHHHHHHHHHHHHH####....\n [224]HHHHHHHHHHHHHHHHHHH####....[223]HHHHHHHHHHHHHHHHHHH####....\n [222]HHHHHHHHHHHHHHHHHHH####....[221]HHHHHHHHHHHHHHHHHHH####....\n [220]HHHHHHHHHHHHHHHHHHH####....[219]HHHHHHHHHHHHHHHHHHH####....\n [218]HHHHHHHHHHHHHHHHHHH####....[217]HHHHHHHHHHHHHHHHHHH####....\n [216]HHHHHHHHHHHHHHHHHHH####....[215]HHHHHHHHHHHHHHHHHHH####....\n [214]HHHHHHHHHHHHHHHHHHH####....[213]HHHHHHHHHHHHHHHHHHH####....\n [212]HHHHHHHHHHHHHHHHHHH####....[211]HHHHHHHHHHHHHHHHHHH####....\n [210]HHHHHHHHHHHHHHHHHHH####....[209]HHHHHHHHHHHHHHHHHHH####....\n [208]HHHHHHHHHHHHHHHHHHH####....[207]HHHHHHHHHHHHHHHHHHH####....\n [206]HHHHHHHHHHHHHHHHHHH####....[205]HHHHHHHHHHHHHHHHHHH####....\n [204]HHHHHHHHHHHHHHHHHHH####....[203]HHHHHHHHHHHHHHHHHHH####....\n [202]HHHHHHHHHHHHHHHHHHH####....[201]HHHHHHHHHHHHHHHHHHH####....\n [200]HHHHHHHHHHHHHHHHHHH####....[199]HHHHHHHHHHHHHHHHHHH####....\n [198]HHHHHHHHHHHHHHHHHHH####....[197]HHHHHHHHHHHHHHHHHHH####....\n [196]HHHHHHHHHHHHHHHHHHH####....[195]HHHHHHHHHHHHHHHHHHH####....\n [194]HHHHHHHHHHHHHHHHHHH####....[193]HHHHHHHHHHHHHHHHHHH####....\n [192]HHHHHHHHHHHHHHHHHHH####....[191]HHHHHHHHHHHHHHHHHHH####....\n [190]HHHHHHHHHHHHHHHHHHH####....[189]HHHHHHHHHHHHHHHHHHH####....\n [188]HHHHHHHHHHHHHHHHHHH####....[187]HHHHHHHHHHHHHHHHHHH####....\n [186]HHHHHHHHHHHHHHHHHHH####....[185]HHHHHHHHHHHHHHHHHHH####....\n [184]HHHHHHHHHHHHHHHHHHH####....[183]HHHHHHHHHHHHHHHHHHH####....\n [182]HHHHHHHHHHHHHHHHHHH####....[181]HHHHHHHHHHHHHHHHHHH####....\n [180]HHHHHHHHHHHHHHHHHHH####....[179]HHHHHHHHHHHHHHHHHHH####....\n [178]HHHHHHHHHHHHHHHHHHH####....[177]HHHHHHHHHHHHHHHHHHH####....\n [176]HHHHHHHHHHHHHHHHHHH####....[175]HHHHHHHHHHHHHHHHHHH####....\n [174]HHHHHHHHHHHHHHHHHHH####....[173]HHHHHHHHHHHHHHHHHHH####....\n [172]HHHHHHHHHHHHHHHHHHH####....[171]HHHHHHHHHHHHHHHHHHH####....\n [170]HHHHHHHHHHHHHHHHHHH####....[169]HHHHHHHHHHHHHHHHHHH####....\n [168]HHHHHHHHHHHHHHHHHHH####....[167]HHHHHHHHHHHHHHHHHHH####....\n [166]HHHHHHHHHHHHHHHHHHH####....[165]HHHHHHHHHHHHHHHHHHH####....\n [164]HHHHHHHHHHHHHHHHHHH####....[163]HHHHHHHHHHHHHHHHHHH####....\n [162]HHHHHHHHHHHHHHHHHHH####....[161]HHHHHHHHHHHHHHHHHHH####....\n [160]HHHHHHHHHHHHHHHHHHH####....[159]HHHHHHHHHHHHHHHHHHH####....\n [158]HHHHHHHHHHHHHHHHHHH####....[157]HHHHHHHHHHHHHHHHHHH####....\n [156]HHHHHHHHHHHHHHHHHHH####....[155]HHHHHHHHHHHHHHHHHHH####....\n [154]HHHHHHHHHHHHHHHHHHH####....[153]HHHHHHHHHHHHHHHHHHH####....\n [152]HHHHHHHHHHHHHHHHHHH####....[151]HHHHHHHHHHHHHHHHHHH####....\n [150]HHHHHHHHHHHHHHHHHHH####....[149]HHHHHHHHHHHHHHHHHHH####....\n [148]HHHHHHHHHHHHHHHHHHH####....[147]HHHHHHHHHHHHHHHHHHH####....\n [146]HHHHHHHHHHHHHHHHHHH####....[145]HHHHHHHHHHHHHHHHHHH####....\n [144]HHHHHHHHHHHHHHHHHHH####....[143]HHHHHHHHHHHHHHHHHHH####....\n [142]HHHHHHHHHHHHHHHHHHH####....[141]HHHHHHHHHHHHHHHHHHH####....\n [140]HHHHHHHHHHHHHHHHHHH####....[139]HHHHHHHHHHHHHHHHHHH####....\n [138]HHHHHHHHHHHHHHHHHHH####....[137]HHHHHHHHHHHHHHHHHHH####....\n [136]HHHHHHHHHHHHHHHHHHH####....[135]HHHHHHHHHHHHHHHHHHH####....\n [134]HHHHHHHHHHHHHHHHHHH####....[133]HHHHHHHHHHHHHHHHHHH####....\n [132]HHHHHHHHHHHHHHHHHHH####....[131]HHHHHHHHHHHHHHHHHHH####....\n [130]HHHHHHHHHHHHHHHHHHH####....[129]HHHHHHHHHHHHHHHHHHH####....\n [128]HHHHHHHHHHHHHHHHHHH####....[127]HHHHHHHHHHHHHHHHHHH####....\n [126]HHHHHHHHHHHHHHHHHHH####....[125]HHHHHHHHHHHHHHHHHHH####....\n [124]HHHHHHHHHHHHHHHHHHH####....[123]HHHHHHHHHHHHHHHHHHH####....\n [122]HHHHHHHHHHHHHHHHHHH####....[121]HHHHHHHHHHHHHHHHHHH####....\n [120]HHHHHHHHHHHHHHHHHHH####....[119]HHHHHHHHHHHHHHHHHHH####....\n [118]HHHHHHHHHHHHHHHHHHH####....[117]HHHHHHHHHHHHHHHHHHH####....\n [116]HHHHHHHHHHHHHHHHHHH####....[115]HHHHHHHHHHHHHHHHHHH####....\n [114]HHHHHHHHHHHHHHHHHHH####....[113]HHHHHHHHHHHHHHHHHHH####....\n [112]HHHHHHHHHHHHHHHHHHH####....[111]HHHHHHHHHHHHHHHHHHH####....\n [110]HHHHHHHHHHHHHHHHHHH####....[109]HHHHHHHHHHHHHHHHHHH####....\n [108]HHHHHHHHHHHHHHHHHHH####....[107]HHHHHHHHHHHHHHHHHHH####....\n [106]HHHHHHHHHHHHHHHHHHH####....[105]HHHHHHHHHHHHHHHHHHH####....\n [104]HHHHHHHHHHHHHHHHHHH####....[103]HHHHHHHHHHHHHHHHHHH####....\n [102]HHHHHHHHHHHHHHHHHHH####....[101]HHHHHHHHHHHHHHHHHHH####....\n [100]HHHHHHHHHHHHHHHHHHH####....[99]HHHHHHHHHHHHHHHHHHHH####....\n [98]HHHHHHHHHHHHHHHHHHHH####....[97]HHHHHHHHHHHHHHHHHHHH####....\n [96]HHHHHHHHHHHHHHHHHHHH####....[95]HHHHHHHHHHHHHHHHHHHH####....\n [94]HHHHHHHHHHHHHHHHHHHH####....[93]HHHHHHHHHHHHHHHHHHHH####....\n [92]HHHHHHHHHHHHHHHHHHHH####....[91]HHHHHHHHHHHHHHHHHHHH####....\n [90]HHHHHHHHHHHHHHHHHHHH####....[89]HHHHHHHHHHHHHHHHHHHH####....\n [88]HHHHHHHHHHHHHHHHHHHH####....[87]HHHHHHHHHHHHHHHHHHHH####....\n [86]HHHHHHHHHHHHHHHHHHHH####....[85]HHHHHHHHHHHHHHHHHHHH####....\n [84]HHHHHHHHHHHHHHHHHHHH####....[83]HHHHHHHHHHHHHHHHHHHH####....\n [82]HHHHHHHHHHHHHHHHHHHH####....[81]HHHHHHHHHHHHHHHHHHHH####....\n [80]HHHHHHHHHHHHHHHHHHHH####....[79]HHHHHHHHHHHHHHHHHHHH####....\n [78]HHHHHHHHHHHHHHHHHHHH####....[77]HHHHHHHHHHHHHHHHHHHH####....\n [76]HHHHHHHHHHHHHHHHHHHH####....[75]HHHHHHHHHHHHHHHHHHHH####....\n [74]HHHHHHHHHHHHHHHHHHHH####....[73]HHHHHHHHHHHHHHHHHHHH####....\n [72]HHHHHHHHHHHHHHHHHHHH####....[71]HHHHHHHHHHHHHHHHHHHH####....\n [70]HHHHHHHHHHHHHHHHHHHH####....[69]HHHHHHHHHHHHHHHHHHHH####....\n [68]HHHHHHHHHHHHHHHHHHHH####....[67]HHHHHHHHHHHHHHHHHHHH####....\n [66]HHHHHHHHHHHHHHHHHHHH####....[65]HHHHHHHHHHHHHHHHHHHH####....\n [64]HHHHHHHHHHHHHHHHHHHH####....[63]HHHHHHHHHHHHHHHHHHHH####....\n [62]HHHHHHHHHHHHHHHHHHHH####....[61]HHHHHHHHHHHHHHHHHHHH####....\n [60]HHHHHHHHHHHHHHHHHHHH####....[59]HHHHHHHHHHHHHHHHHHHH####....\n [58]HHHHHHHHHHHHHHHHHHHH####....[57]HHHHHHHHHHHHHHHHHHHH####....\n [56]HHHHHHHHHHHHHHHHHHHH####....[55]HHHHHHHHHHHHHHHHHHHH####....\n [54]HHHHHHHHHHHHHHHHHHHH####....[53]HHHHHHHHHHHHHHHHHHHH####....\n [52]HHHHHHHHHHHHHHHHHHHH####....[51]HHHHHHHHHHHHHHHHHHHH####....\n [50]HHHHHHHHHHHHHHHHHHHH####....[49]HHHHHHHHHHHHHHHHHHHH####....\n [48]HHHHHHHHHHHHHHHHHHHH####....[47]HHHHHHHHHHHHHHHHHHHH####....\n [46]HHHHHHHHHHHHHHHHHHHH####....[45]HHHHHHHHHHHHHHHHHHHH####....\n [44]HHHHHHHHHHHHHHHHHHHH####....[43]HHHHHHHHHHHHHHHHHHHH####....\n [42]HHHHHHHHHHHHHHHHHHHH####....[41]HHHHHHHHHHHHHHHHHHHH####....\n [40]HHHHHHHHHHHHHHHHHHHH####....[39]HHHHHHHHHHHHHHHHHHHH####....\n [38]HHHHHHHHHHHHHHHHHHHH####....[37]HHHHHHHHHHHHHHHHHHHH####....\n [36]HHHHHHHHHHHHHHHHHHHH####....[35]HHHHHHHHHHHHHHHHHHHH####....\n [34]HHHHHHHHHHHHHHHHHHHH####....[33]HHHHHHHHHHHHHHHHHHHH####....\n [32]HHHHHHHHHHHHHHHHHHHH####....[31]HHHHHHHHHHHHHHHHHHHH####....\n [30]HHHHHHHHHHHHHHHHHHHH####....[29]HHHHHHHHHHHHHHHHHHHH####....\n [28]HHHHHHHHHHHHHHHHHHHH####....[27]HHHHHHHHHHHHHHHHHHHH####....\n [26]HHHHHHHHHHHHHHHHHHHH####....[25]HHHHHHHHHHHHHHHHHHHH####....\n [24]HHHHHHHHHHHHHHHHHHHH####....[23]HHHHHHHHHHHHHHHHHHHH####....\n [22]HHHHHHHHHHHHHHHHHHHH####....[21]HHHHHHHHHHHHHHHHHHHH####....\n [20]HHHHHHHHHHHHHHHHHHHH####....[19]HHHHHHHHHHHHHHHHHHHH####....\n [18]HHHHHHHHHHHHHHHHHHHH####....[17]HHHHHHHHHHHHHHHHHHHH####....\n [16]HHHHHHHHHHHHHHHHHHHH####....[15]HHHHHHHHHHHHHHHHHHHH####....\n [14]HHHHHHHHHHHHHHHHHHHH####....[13]HHHHHHHHHHHHHHHHHHHH####....\n [12]HHHHHHHHHHHHHHHHHHHH####....[11]HHHHHHHHHHHHHHHHHHHH####....\n [10]HHHHHHHHHHHHHHHHHHHH####....[9]HHHHHHHHHHHHHHHHHHHHH####....\n [8]HHHHHHHHHHHHHHHHHHHHH####....[7]HHHHHHHHHHHHHHHHHHHHH####....\n [6]HHHHHHHHHHHHHHHHHHHHH####....[5]HHHHHHHHHHHHHHHHHHHHH####....\n [4]HHHHHHHHHHHHHHHHHHHHH####....[3]HHHHHHHHHHHHHHHHHHHHH####....\n [2]HHHHHHHHHHHHHHHHHHHHH####....[1]HHHHHHHHHHHHHHHHHHHHH####....\n(128 rows)\n```\n\nAt the start of the page, you can see the page header (`P`s). After that come\nline pointers, in increasing order. In this case, they are all normal\n(`N`). After some empty space are the tuples. These are in decreasing order, as\nthey are added from the end of the page. The page is full when there is no more\nroom for a tuple between the last line pointer and the last tuple.\n\nEach tuple contains a header (the `H`s), and 4 bytes of data for the 32-bit\ninteger attribute `a`. After that there is 4 bytes of padding (`....`) between\neach tuple. This is there because tuple headers must be word-aligned. The tuple\nheader is 24 bytes here, and there are another 4 bytes for the integer\nattribute, giving a total of 28 bytes per tuple. This example was run on a\n64-bit machine, so words are 8 bytes. The next multiple of 8 larger than 28 is\n32, hence the 4 bytes of padding.\n\nHere's an example with a variable length text column:\n\n```\n# create table pvtest3(a text);\nCREATE TABLE\n\n# insert into pvtest3 select repeat('X', generate_series(0, 50, 10));\nINSERT 0 6\n\n# select * from pvtest3;\n                         a\n----------------------------------------------------\n\n XXXXXXXXXX\n XXXXXXXXXXXXXXXXXXXX\n XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n(6 rows)\n\n# select show_page('pvtest3', 0, 64);\n                             show_page\n------------------------------------------------------------------\n PPPPPPPPPPPPPPPPPPPPPPPP001N002N003N004N005N006N\n   \u003c\u003c Hole - 121 rows skipped \u003e\u003e\n                                                         [6]HHHHH\n HHHHHHHHHHHHHHHH################################################\n ###.....[5]HHHHHHHHHHHHHHHHHHHHH################################\n #########.......[4]HHHHHHHHHHHHHHHHHHHHH########################\n #######.[3]HHHHHHHHHHHHHHHHHHHHH#####################...[2]HHHHH\n HHHHHHHHHHHHHHHH###########.....[1]HHHHHHHHHHHHHHHHHHHHH#.......\n(8 rows)\n```\n\nIn this, the first tuple has a single byte of data. This is a 1 byte `varlena`\nlength word, which will contain a value of zero as the attribute is empty. The\nremaining columns are, as you'd expect, length(a) + 1 bytes, as they are all\nshort enough to be stored inline (not in a TOAST table).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhollobon%2Fpagevis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhollobon%2Fpagevis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhollobon%2Fpagevis/lists"}