PolarDB-for-PostgreSQL
60 строк · 1.5 Кб
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-2018, 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*/
33PG_FUNCTION_INFO_V1(fsm_page_contents);34
35Datum
36fsm_page_contents(PG_FUNCTION_ARGS)37{
38bytea *raw_page = PG_GETARG_BYTEA_P(0);39StringInfoData sinfo;40FSMPage fsmpage;41int i;42
43if (!superuser())44ereport(ERROR,45(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),46(errmsg("must be superuser to use raw page functions"))));47
48fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page));49
50initStringInfo(&sinfo);51
52for (i = 0; i < NodesPerPage; i++)53{54if (fsmpage->fp_nodes[i] != 0)55appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]);56}57appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot);58
59PG_RETURN_TEXT_P(cstring_to_text_with_len(sinfo.data, sinfo.len));60}
61