50 #define IS_INDEX(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
51 #define IS_BTREE(r) ((r)->rd_rel->relam == BTREE_AM_OID)
52 #define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X))
53 #define ItemPointerGetDatum(X) PointerGetDatum(X)
56 #define CHECK_RELATION_BLOCK_RANGE(rel, blkno) { \
57 if ( RelationGetNumberOfBlocks(rel) <= (BlockNumber) (blkno) ) \
58 elog(ERROR, "block number out of range"); }
104 stat->dead_items =
stat->live_items = 0;
128 elog(
DEBUG2,
"deleted page from block %u has safexid %u:%u",
133 elog(
DEBUG2,
"deleted page from block %u has safexid %u",
173 if ((
stat->live_items +
stat->dead_items) > 0)
174 stat->avg_item_size = item_size / (
stat->live_items +
stat->dead_items);
176 stat->avg_item_size = 0;
202 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
203 errmsg(
"must be superuser to use pageinspect functions")));
210 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
211 errmsg(
"\"%s\" is not a %s index",
221 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
222 errmsg(
"cannot access temporary tables of other sessions")));
226 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
227 errmsg(
"invalid block number")));
231 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
232 errmsg(
"block 0 is a meta page")));
241 stat.btpo_flags =
stat.free_size =
stat.avg_item_size = 0;
250 elog(
ERROR,
"return type must be a row type");
334 memset(nulls, 0,
sizeof(nulls));
373 elog(
ERROR,
"invalid tuple length %d for tuple at offset number %u",
377 for (off = 0; off < dlen; off++)
381 sprintf(dump,
"%02x", *(ptr + off) & 0xff);
393 ispivottuple = (!leafpage || (!rightmost && offset ==
P_HIKEY));
426 for (
int i = 0;
i < nposting;
i++)
432 false, TYPALIGN_SHORT));
464 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
465 errmsg(
"must be superuser to use pageinspect functions")));
482 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
483 errmsg(
"\"%s\" is not a %s index",
493 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
494 errmsg(
"cannot access temporary tables of other sessions")));
498 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
499 errmsg(
"invalid block number")));
503 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
504 errmsg(
"block 0 is a meta page")));
543 elog(
ERROR,
"return type must be a row type");
546 uargs->
tupd = tupleDesc;
598 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
599 errmsg(
"must be superuser to use raw page functions")));
625 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
626 errmsg(
"input page is not a valid %s page",
"btree"),
627 errdetail(
"Expected special size %d, got %d.",
635 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
636 errmsg(
"block is a meta page")));
640 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
641 errmsg(
"block is not a valid btree leaf page")));
659 elog(
ERROR,
"return type must be a row type");
662 uargs->
tupd = tupleDesc;
683 #define BT_METAP_COLS_V1_8 9
710 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
711 errmsg(
"must be superuser to use pageinspect functions")));
718 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
719 errmsg(
"\"%s\" is not a %s index",
729 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
730 errmsg(
"cannot access temporary tables of other sessions")));
740 elog(
ERROR,
"return type must be a row type");
752 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
753 errmsg(
"function has wrong number of declared columns"),
754 errhint(
"To resolve the problem, update the \"pageinspect\" extension to the latest version.")));
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
#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)
Datum bt_metap(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(bt_metap)
static Datum bt_page_print_tuples(struct user_args *uargs)
static void GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat)
#define ItemPointerGetDatum(X)
#define CHECK_RELATION_BLOCK_RANGE(rel, blkno)
static Datum bt_page_items_internal(PG_FUNCTION_ARGS, enum pageinspect_version ext_version)
void UnlockReleaseBuffer(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define BUFFER_LOCK_SHARE
#define BufferGetPage(buffer)
Size PageGetFreeSpace(Page page)
PageHeaderData * PageHeader
#define PageGetSpecialSize(page)
#define PageGetMaxOffsetNumber(page)
#define PageGetItemId(page, offsetNumber)
#define PageGetItem(page, itemId)
#define SizeOfPageHeaderData
#define PageGetPageSize(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 HeapTupleGetDatum(tuple)
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
#define SRF_RETURN_DONE(_funcctx)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
#define ItemIdIsDead(itemId)
#define ItemIdIsValid(itemId)
#define IndexTupleHasVarwidths(itup)
#define IndexTupleHasNulls(itup)
#define IndexInfoFindDataOffset(t_info)
IndexTupleData * IndexTuple
#define IndexTupleSize(itup)
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * palloc0(Size size)
RangeVar * makeRangeVarFromNameList(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)
#define PointerGetDatum(X)
char * psprintf(const char *fmt,...)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_openrv(const RangeVar *relation, 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)