Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * fsmfuncs.c 4 : * Functions to investigate FSM pages 5 : * 6 : * These functions are restricted to superusers for the fear of introducing 7 : * security holes if the input checking isn't as water-tight as it should. 8 : * You'd need to be superuser to obtain a raw page image anyway, so 9 : * there's hardly any use case for using these without superuser-rights 10 : * anyway. 11 : * 12 : * Copyright (c) 2007-2024, PostgreSQL Global Development Group 13 : * 14 : * IDENTIFICATION 15 : * contrib/pageinspect/fsmfuncs.c 16 : * 17 : *------------------------------------------------------------------------- 18 : */ 19 : 20 : #include "postgres.h" 21 : 22 : #include "fmgr.h" 23 : #include "lib/stringinfo.h" 24 : #include "miscadmin.h" 25 : #include "pageinspect.h" 26 : #include "storage/fsm_internals.h" 27 : #include "utils/builtins.h" 28 : 29 : /* 30 : * Dumps the contents of a FSM page. 31 : */ 32 14 : PG_FUNCTION_INFO_V1(fsm_page_contents); 33 : 34 : Datum 35 6 : fsm_page_contents(PG_FUNCTION_ARGS) 36 : { 37 6 : bytea *raw_page = PG_GETARG_BYTEA_P(0); 38 : StringInfoData sinfo; 39 : Page page; 40 : FSMPage fsmpage; 41 : int i; 42 : 43 6 : if (!superuser()) 44 0 : ereport(ERROR, 45 : (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), 46 : errmsg("must be superuser to use raw page functions"))); 47 : 48 6 : page = get_page_from_raw(raw_page); 49 : 50 4 : if (PageIsNew(page)) 51 2 : PG_RETURN_NULL(); 52 : 53 2 : fsmpage = (FSMPage) PageGetContents(page); 54 : 55 2 : initStringInfo(&sinfo); 56 : 57 16330 : for (i = 0; i < NodesPerPage; i++) 58 : { 59 16328 : if (fsmpage->fp_nodes[i] != 0) 60 26 : appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]); 61 : } 62 2 : appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot); 63 : 64 2 : PG_RETURN_TEXT_P(cstring_to_text_with_len(sinfo.data, sinfo.len)); 65 : }