19#include "catalog/pg_am_d.h"
47#define NUM_OUTPUT_COLUMNS 10
72 void *callback_private_data,
73 void *per_buffer_data)
223 stat->dead_tuple_count++;
226 elog(
ERROR,
"unexpected HeapTupleSatisfiesVacuum result");
258 stat->scanned_percent = 100.0 * p.
scanned / nblocks;
259 stat->tuple_percent = 100.0 *
stat->tuple_len /
stat->table_len;
260 stat->dead_tuple_percent = 100.0 *
stat->dead_tuple_len /
stat->table_len;
261 stat->free_percent = 100.0 *
stat->free_space /
stat->table_len;
286 errmsg(
"must be superuser to use pgstattuple functions")));
318 elog(
ERROR,
"return type must be a row type");
321 elog(
ERROR,
"incorrect number of output arguments");
333 errmsg(
"cannot access temporary tables of other sessions")));
344 errmsg(
"relation \"%s\" is of wrong relation kind",
350 errmsg(
"only heap AM is supported")));
356 memset(nulls, 0,
sizeof(nulls));
#define InvalidBlockNumber
static Datum values[MAXATTR]
BlockNumber BufferGetBlockNumber(Buffer buffer)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
static bool BufferIsValid(Buffer bufnum)
Size PageGetExactFreeSpace(const PageData *page)
static bool PageIsEmpty(const PageData *page)
static bool PageIsNew(const PageData *page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define Assert(condition)
int errcode(int sqlerrcode)
#define ereport(elevel,...)
#define PG_FUNCTION_INFO_V1(funcname)
#define PG_RETURN_DATUM(x)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
Size GetRecordedFreeSpace(Relation rel, BlockNumber heapBlk)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
@ HEAPTUPLE_RECENTLY_DEAD
@ HEAPTUPLE_INSERT_IN_PROGRESS
@ HEAPTUPLE_DELETE_IN_PROGRESS
HTSV_Result HeapTupleSatisfiesVacuum(HeapTuple htup, TransactionId OldestXmin, Buffer buffer)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
HeapTupleHeaderData * HeapTupleHeader
#define ItemIdGetLength(itemId)
#define ItemIdIsNormal(itemId)
#define ItemIdIsDead(itemId)
#define ItemIdIsUsed(itemId)
#define ItemIdIsRedirected(itemId)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
#define CHECK_FOR_INTERRUPTS()
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
int errdetail_relkind_not_supported(char relkind)
static char buf[DEFAULT_XLOG_SEG_SIZE]
static void statapprox_heap(Relation rel, output_type *stat)
Datum pgstattuple_approx(PG_FUNCTION_ARGS)
#define NUM_OUTPUT_COLUMNS
Datum pgstattuple_approx_internal(Oid relid, FunctionCallInfo fcinfo)
Datum pgstattuple_approx_v1_5(PG_FUNCTION_ARGS)
static BlockNumber statapprox_heap_read_stream_next(ReadStream *stream, void *callback_private_data, void *per_buffer_data)
static Datum Int64GetDatum(int64 X)
static Datum Float8GetDatum(float8 X)
TransactionId GetOldestNonRemovableTransactionId(Relation rel)
Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
ReadStream * read_stream_begin_relation(int flags, BufferAccessStrategy strategy, Relation rel, ForkNumber forknum, ReadStreamBlockNumberCB callback, void *callback_private_data, size_t per_buffer_data_size)
void read_stream_end(ReadStream *stream)
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
BlockNumber current_blocknum
double dead_tuple_percent
double vac_estimate_reltuples(Relation relation, BlockNumber total_pages, BlockNumber scanned_pages, double scanned_tuples)
#define VM_ALL_VISIBLE(r, b, v)