96 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
97 errmsg(
"recovery is in progress"),
98 errhint(
"heap surgery functions cannot be executed during recovery.")));
108 if (!RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
110 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
111 errmsg(
"cannot operate on relation \"%s\"",
115 if (rel->
rd_rel->relam != HEAP_TABLE_AM_OID)
117 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
118 errmsg(
"only heap AM is supported")));
136 curr_start_ptr = next_start_ptr = 0;
142 while (next_start_ptr != ntids)
151 bool did_modify_page =
false;
152 bool did_modify_vm =
false;
163 if (blkno >= nblocks)
166 curr_start_ptr = next_start_ptr;
169 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
170 errmsg(
"skipping block %u for relation \"%s\" because the block number is out of range",
186 memset(include_this_tid, 0,
sizeof(include_this_tid));
187 for (
i = curr_start_ptr;
i < next_start_ptr;
i++)
196 errmsg(
"skipping tid (%u, %u) for relation \"%s\" because the item number is out of range",
207 errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it redirects to item %u",
215 (
errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it is marked dead",
222 (
errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it is marked unused",
229 include_this_tid[offno] =
true;
247 if (!include_this_tid[curoff])
253 did_modify_page =
true;
269 did_modify_vm =
true;
335 curr_start_ptr = next_start_ptr;
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
#define PG_GETARG_ARRAYTYPE_P_COPY(n)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void LockBufferForCleanup(Buffer buffer)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define RelationGetNumberOfBlocks(reln)
static Page BufferGetPage(Buffer buffer)
static Item PageGetItem(Page page, ItemId itemId)
static void PageClearAllVisible(Page page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static bool PageIsAllVisible(Page page)
static OffsetNumber PageGetMaxOffsetNumber(Page page)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
static int32 tidcmp(const void *a, const void *b)
static BlockNumber find_tids_one_page(ItemPointer tids, int ntids, OffsetNumber *next_start_ptr)
static void sanity_check_tid_array(ArrayType *ta, int *ntids)
HeapTupleHeaderData * HeapTupleHeader
#define HEAP_KEYS_UPDATED
#define HeapTupleHeaderSetXmin(tup, xid)
#define HeapTupleHeaderSetXmax(tup, xid)
#define HeapTupleHeaderSetXvac(tup, xid)
#define HEAP_XMAX_INVALID
#define MaxHeapTuplesPerPage
#define ItemIdIsNormal(itemId)
#define ItemIdGetRedirect(itemId)
#define ItemIdIsDead(itemId)
#define ItemIdSetDead(itemId)
#define ItemIdIsUsed(itemId)
#define ItemIdIsRedirected(itemId)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
static OffsetNumber ItemPointerGetOffsetNumberNoCheck(const ItemPointerData *pointer)
ItemPointerData * ItemPointer
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define END_CRIT_SECTION()
ObjectType get_relkind_objtype(char relkind)
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
int errdetail_relkind_not_supported(char relkind)
#define qsort(a, b, c, d)
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
#define FrozenTransactionId
#define InvalidTransactionId
bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *vmbuf)
#define VISIBILITYMAP_VALID_BITS
bool RecoveryInProgress(void)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)