2008-09-30 18:52:14 +08:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* fsmfuncs.c
|
|
|
|
* Functions to investigate FSM pages
|
|
|
|
*
|
|
|
|
* These functions are restricted to superusers for the fear of introducing
|
|
|
|
* security holes if the input checking isn't as water-tight as it should.
|
|
|
|
* You'd need to be superuser to obtain a raw page image anyway, so
|
|
|
|
* there's hardly any use case for using these without superuser-rights
|
|
|
|
* anyway.
|
|
|
|
*
|
2013-01-02 06:15:01 +08:00
|
|
|
* Copyright (c) 2007-2013, PostgreSQL Global Development Group
|
2008-09-30 18:52:14 +08:00
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2010-09-21 04:08:53 +08:00
|
|
|
* contrib/pageinspect/fsmfuncs.c
|
2008-09-30 18:52:14 +08:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "postgres.h"
|
2012-08-29 11:43:09 +08:00
|
|
|
|
|
|
|
#include "funcapi.h"
|
|
|
|
#include "lib/stringinfo.h"
|
|
|
|
#include "miscadmin.h"
|
2008-09-30 18:52:14 +08:00
|
|
|
#include "storage/fsm_internals.h"
|
|
|
|
#include "utils/builtins.h"
|
|
|
|
|
2009-06-11 22:49:15 +08:00
|
|
|
Datum fsm_page_contents(PG_FUNCTION_ARGS);
|
2008-09-30 18:52:14 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Dumps the contents of a FSM page.
|
|
|
|
*/
|
|
|
|
PG_FUNCTION_INFO_V1(fsm_page_contents);
|
|
|
|
|
|
|
|
Datum
|
|
|
|
fsm_page_contents(PG_FUNCTION_ARGS)
|
|
|
|
{
|
|
|
|
bytea *raw_page = PG_GETARG_BYTEA_P(0);
|
|
|
|
StringInfoData sinfo;
|
|
|
|
FSMPage fsmpage;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!superuser())
|
|
|
|
ereport(ERROR,
|
|
|
|
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
|
|
|
(errmsg("must be superuser to use raw page functions"))));
|
|
|
|
|
|
|
|
fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page));
|
|
|
|
|
|
|
|
initStringInfo(&sinfo);
|
|
|
|
|
2009-06-11 22:49:15 +08:00
|
|
|
for (i = 0; i < NodesPerPage; i++)
|
2008-09-30 18:52:14 +08:00
|
|
|
{
|
|
|
|
if (fsmpage->fp_nodes[i] != 0)
|
|
|
|
appendStringInfo(&sinfo, "%d: %d\n", i, fsmpage->fp_nodes[i]);
|
|
|
|
}
|
|
|
|
appendStringInfo(&sinfo, "fp_next_slot: %d\n", fsmpage->fp_next_slot);
|
|
|
|
|
|
|
|
PG_RETURN_TEXT_P(cstring_to_text(sinfo.data));
|
|
|
|
}
|