52#define IS_INDEX(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
53#define IS_BTREE(r) ((r)->rd_rel->relam == BTREE_AM_OID)
122 stat->dead_items =
stat->live_items = 0;
146 elog(
DEBUG2,
"deleted page from block %u has safexid %u:%u",
151 elog(
DEBUG2,
"deleted page from block %u has safexid %u",
191 if ((
stat->live_items +
stat->dead_items) > 0)
194 stat->avg_item_size = 0;
215 errmsg(
"block number %" PRId64 " is out of range", blkno)));
231 errmsg(
"\"%s\" is not a %s index",
242 errmsg(
"cannot access temporary tables of other sessions")));
247 errmsg(
"block 0 is a meta page")));
277 errmsg(
"must be superuser to use pageinspect functions")));
289 stat.btpo_flags =
stat.free_size =
stat.avg_item_size = 0;
298 elog(
ERROR,
"return type must be a row type");
354 errmsg(
"must be superuser to use pageinspect functions")));
385 uargs->blkno = blkno;
386 uargs->blk_count = blk_count;
387 uargs->allpages = (blk_count < 0);
413 if (
uargs->blk_count > 0)
429 stat.btpo_flags =
stat.free_size =
stat.avg_item_size = 0;
438 elog(
ERROR,
"return type must be a row type");
485 bool leafpage =
uargs->leafpage;
486 bool rightmost =
uargs->rightmost;
509 memset(nulls, 0,
sizeof(nulls));
548 elog(
ERROR,
"invalid tuple length %d for tuple at offset number %u",
552 for (off = 0; off <
dlen; off++)
556 sprintf(dump,
"%02x", *(ptr + off) & 0xff);
636 errmsg(
"must be superuser to use pageinspect functions")));
688 elog(
ERROR,
"return type must be a row type");
701 if (
fctx->call_cntr <
fctx->max_calls)
744 errmsg(
"must be superuser to use raw page functions")));
771 errmsg(
"input page is not a valid %s page",
"btree"),
772 errdetail(
"Expected special size %d, got %d.",
781 errmsg(
"block is a meta page")));
786 errmsg(
"block is not a valid btree leaf page")));
804 elog(
ERROR,
"return type must be a row type");
817 if (
fctx->call_cntr <
fctx->max_calls)
828#define BT_METAP_COLS_V1_8 9
856 errmsg(
"must be superuser to use pageinspect functions")));
864 errmsg(
"\"%s\" is not a %s index",
875 errmsg(
"cannot access temporary tables of other sessions")));
885 elog(
ERROR,
"return type must be a row type");
898 errmsg(
"function has wrong number of declared columns"),
899 errhint(
"To resolve the problem, update the \"pageinspect\" extension to the latest version.")));
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
#define InvalidBlockNumber
static Datum values[MAXATTR]
Datum bt_page_stats(PG_FUNCTION_ARGS)
Datum bt_page_items(PG_FUNCTION_ARGS)
Datum bt_page_stats_1_9(PG_FUNCTION_ARGS)
Datum bt_page_items_1_9(PG_FUNCTION_ARGS)
Datum bt_page_items_bytea(PG_FUNCTION_ARGS)
#define BT_METAP_COLS_V1_8
static Datum bt_page_stats_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version)
static void bt_index_block_validate(Relation rel, int64 blkno)
Datum bt_metap(PG_FUNCTION_ARGS)
static void check_relation_block_range(Relation rel, int64 blkno)
static Datum bt_page_print_tuples(ua_page_items *uargs)
static void GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat)
static Datum bt_page_items_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version)
Datum bt_multi_page_stats(PG_FUNCTION_ARGS)
void UnlockReleaseBuffer(Buffer buffer)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
Size PageGetFreeSpace(const PageData *page)
PageHeaderData * PageHeader
static uint16 PageGetSpecialSize(const PageData *page)
static Size PageGetPageSize(const PageData *page)
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define CStringGetTextDatum(s)
#define Assert(condition)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
#define palloc_object(type)
#define PG_GETARG_TEXT_PP(n)
#define PG_GETARG_UINT32(n)
#define PG_GETARG_INT64(n)
#define PG_FUNCTION_INFO_V1(funcname)
#define PG_RETURN_DATUM(x)
#define PG_GETARG_BYTEA_P(n)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
#define ItemIdIsDead(itemId)
#define ItemIdIsValid(itemId)
static Datum ItemPointerGetDatum(const ItemPointerData *X)
static bool IndexTupleHasVarwidths(const IndexTupleData *itup)
IndexTupleData * IndexTuple
static bool IndexTupleHasNulls(const IndexTupleData *itup)
static Size IndexTupleSize(const IndexTupleData *itup)
static Size IndexInfoFindDataOffset(unsigned short t_info)
void pfree(void *pointer)
void * palloc0(Size size)
RangeVar * makeRangeVarFromNameList(const List *names)
#define P_HAS_FULLXID(opaque)
static uint16 BTreeTupleGetNPosting(IndexTuple posting)
static bool BTreeTupleIsPivot(IndexTuple itup)
static FullTransactionId BTPageGetDeleteXid(Page page)
#define BTPageGetOpaque(page)
#define P_ISDELETED(opaque)
static ItemPointer BTreeTupleGetPosting(IndexTuple posting)
static uint32 BTreeTupleGetPostingOffset(IndexTuple posting)
#define P_RIGHTMOST(opaque)
static bool BTreeTupleIsPosting(IndexTuple itup)
#define BTREE_NOVAC_VERSION
static ItemPointer BTreeTupleGetHeapTID(IndexTuple itup)
#define InvalidOffsetNumber
#define FirstOffsetNumber
Page get_page_from_raw(bytea *raw_page)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static Datum PointerGetDatum(const void *X)
static Datum UInt16GetDatum(uint16 X)
static Datum BoolGetDatum(bool X)
static Datum Int32GetDatum(int32 X)
char * psprintf(const char *fmt,...)
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
#define EpochFromFullTransactionId(x)
#define XidFromFullTransactionId(x)
List * textToQualifiedNameList(text *textval)