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-2019, PostgreSQL Global Development Group
13 *
14 * IDENTIFICATION
15 * contrib/pageinspect/fsmfuncs.c
16 *
17 *-------------------------------------------------------------------------
18 */
19
20 #include "postgres.h"
21
22 #include "pageinspect.h"
23
24 #include "funcapi.h"
25 #include "lib/stringinfo.h"
26 #include "miscadmin.h"
27 #include "storage/fsm_internals.h"
28 #include "utils/builtins.h"
29
30 /*
31 * Dumps the contents of a FSM page.
32 */
33 PG_FUNCTION_INFO_V1(fsm_page_contents);
34
35 Datum
fsm_page_contents(PG_FUNCTION_ARGS)36 fsm_page_contents(PG_FUNCTION_ARGS)
37 {
38 bytea *raw_page = PG_GETARG_BYTEA_P(0);
39 StringInfoData sinfo;
40 FSMPage fsmpage;
41 int i;
42
43 if (!superuser())
44 ereport(ERROR,
45 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
46 (errmsg("must be superuser to use raw page functions"))));
47
48 fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page));
49
50 initStringInfo(&sinfo);
51
52 for (i = 0; i < NodesPerPage; i++)
53 {
54 if (fsmpage->fp_nodes[i] != 0)
55 appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]);
56 }
57 appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot);
58
59 PG_RETURN_TEXT_P(cstring_to_text_with_len(sinfo.data, sinfo.len));
60 }
61