Age Owner Branch data TLA 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 "funcapi.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 : : */
5675 heikki.linnakangas@i 32 :CBC 7 : PG_FUNCTION_INFO_V1(fsm_page_contents);
33 : :
34 : : Datum
35 : 3 : fsm_page_contents(PG_FUNCTION_ARGS)
36 : : {
37 : 3 : bytea *raw_page = PG_GETARG_BYTEA_P(0);
38 : : StringInfoData sinfo;
39 : : Page page;
40 : : FSMPage fsmpage;
41 : : int i;
42 : :
43 [ - + ]: 3 : if (!superuser())
5675 heikki.linnakangas@i 44 [ # # ]:UBC 0 : ereport(ERROR,
45 : : (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
46 : : errmsg("must be superuser to use raw page functions")));
47 : :
760 michael@paquier.xyz 48 :CBC 3 : page = get_page_from_raw(raw_page);
49 : :
731 50 [ + + ]: 2 : if (PageIsNew(page))
51 : 1 : PG_RETURN_NULL();
52 : :
760 53 : 1 : fsmpage = (FSMPage) PageGetContents(page);
54 : :
5675 heikki.linnakangas@i 55 : 1 : initStringInfo(&sinfo);
56 : :
5421 bruce@momjian.us 57 [ + + ]: 8165 : for (i = 0; i < NodesPerPage; i++)
58 : : {
5675 heikki.linnakangas@i 59 [ + + ]: 8164 : if (fsmpage->fp_nodes[i] != 0)
60 : 13 : appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]);
61 : : }
62 : 1 : appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot);
63 : :
3800 rhaas@postgresql.org 64 : 1 : PG_RETURN_TEXT_P(cstring_to_text_with_len(sinfo.data, sinfo.len));
65 : : }
|