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)
192 stat->avg_item_size = item_size / (
stat->live_items +
stat->dead_items);
194 stat->avg_item_size = 0;
209 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
210 errmsg(
"invalid block number %" PRId64, blkno)));
214 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
215 errmsg(
"block number %" PRId64
" is out of range", blkno)));
230 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
231 errmsg(
"\"%s\" is not a %s index",
241 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
242 errmsg(
"cannot access temporary tables of other sessions")));
246 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
247 errmsg(
"block 0 is a meta page")));
276 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
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");
353 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
354 errmsg(
"must be superuser to use pageinspect functions")));
385 uargs->
blkno = blkno;
429 stat.btpo_flags =
stat.free_size =
stat.avg_item_size = 0;
438 elog(
ERROR,
"return type must be a row type");
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);
568 ispivottuple = (!leafpage || (!rightmost && offset ==
P_HIKEY));
601 for (
int i = 0;
i < nposting;
i++)
635 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
636 errmsg(
"must be superuser to use pageinspect functions")));
688 elog(
ERROR,
"return type must be a row type");
691 uargs->
tupd = tupleDesc;
743 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
744 errmsg(
"must be superuser to use raw page functions")));
770 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
771 errmsg(
"input page is not a valid %s page",
"btree"),
772 errdetail(
"Expected special size %d, got %d.",
780 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
781 errmsg(
"block is a meta page")));
785 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
786 errmsg(
"block is not a valid btree leaf page")));
804 elog(
ERROR,
"return type must be a row type");
807 uargs->
tupd = tupleDesc;
828#define BT_METAP_COLS_V1_8 9
855 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
856 errmsg(
"must be superuser to use pageinspect functions")));
863 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
864 errmsg(
"\"%s\" is not a %s index",
874 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
875 errmsg(
"cannot access temporary tables of other sessions")));
885 elog(
ERROR,
"return type must be a row type");
897 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
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]
struct BTPageStat BTPageStat
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)
struct ua_page_items ua_page_items
PG_FUNCTION_INFO_V1(bt_metap)
struct ua_page_stats ua_page_stats
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)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define BUFFER_LOCK_SHARE
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
Size PageGetFreeSpace(const PageData *page)
PageHeaderData * PageHeader
static uint16 PageGetSpecialSize(const PageData *page)
static Size PageGetPageSize(const PageData *page)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define CStringGetTextDatum(s)
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 PG_GETARG_TEXT_PP(n)
#define PG_GETARG_UINT32(n)
#define PG_GETARG_INT64(n)
#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)
Assert(PointerIsAligned(start, uint64))
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 Int16GetDatum(int16 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)
uint32 btm_last_cleanup_num_delpages
float8 btm_last_cleanup_num_heap_tuples
MemoryContext multi_call_memory_ctx
#define EpochFromFullTransactionId(x)
#define XidFromFullTransactionId(x)
List * textToQualifiedNameList(text *textval)