
On machines with MAXALIGN = 8, the payload of a bytea is not maxaligned, since it will start 4 bytes into a palloc'd value. On alignment-picky hardware, this will cause failures in accesses to 8-byte-wide values within the page. We already encountered this problem when we introduced GIN index inspection functions, and fixed it in commit 84ad68d64. Make use of the same function for hash indexes. A small difficulty is that up to now contrib/pageinspect has not shared any functions at all across files. To support that, introduce a common header file "pageinspect.h" for the module. Also, move get_page_from_raw() out of ginfuncs.c, where it didn't especially belong, and put it in rawpage.c which seems a more natural home. Per buildfarm. Discussion: https://postgr.es/m/17311.1486134714@sss.pgh.pa.us
61 lines
1.5 KiB
C
61 lines
1.5 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* 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.
|
|
*
|
|
* Copyright (c) 2007-2017, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* contrib/pageinspect/fsmfuncs.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "pageinspect.h"
|
|
|
|
#include "funcapi.h"
|
|
#include "lib/stringinfo.h"
|
|
#include "miscadmin.h"
|
|
#include "storage/fsm_internals.h"
|
|
#include "utils/builtins.h"
|
|
|
|
/*
|
|
* 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);
|
|
|
|
for (i = 0; i < NodesPerPage; i++)
|
|
{
|
|
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_with_len(sinfo.data, sinfo.len));
|
|
}
|