18 #include "catalog/pg_am_d.h"
19 #include "catalog/pg_proc_d.h"
95 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
96 errmsg(
"recovery is in progress"),
97 errhint(
"heap surgery functions cannot be executed during recovery.")));
107 if (!RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
109 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
110 errmsg(
"cannot operate on relation \"%s\"",
114 if (rel->
rd_rel->relam != HEAP_TABLE_AM_OID)
116 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
117 errmsg(
"only heap AM is supported")));
135 curr_start_ptr = next_start_ptr = 0;
141 while (next_start_ptr != ntids)
150 bool did_modify_page =
false;
151 bool did_modify_vm =
false;
162 if (blkno >= nblocks)
165 curr_start_ptr = next_start_ptr;
168 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
169 errmsg(
"skipping block %u for relation \"%s\" because the block number is out of range",
185 memset(include_this_tid, 0,
sizeof(include_this_tid));
186 for (
i = curr_start_ptr;
i < next_start_ptr;
i++)
195 errmsg(
"skipping tid (%u, %u) for relation \"%s\" because the item number is out of range",
206 errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it redirects to item %u",
214 (
errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it is marked dead",
221 (
errmsg(
"skipping tid (%u, %u) for relation \"%s\" because it is marked unused",
228 include_this_tid[offno] =
true;
246 if (!include_this_tid[curoff])
252 did_modify_page =
true;
268 did_modify_vm =
true;
334 curr_start_ptr = next_start_ptr;
373 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
374 errmsg(
"array must not contain nulls")));
378 (
errcode(ERRCODE_DATA_EXCEPTION),
379 errmsg(
"argument must be empty or one-dimensional array")));
402 for (
i = *next_start_ptr;
i < ntids;
i++)
408 if (
i == *next_start_ptr)
411 if (prev_blkno != blkno)
bool pg_class_ownercheck(Oid class_oid, Oid roleid)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
#define PG_GETARG_ARRAYTYPE_P_COPY(n)
bool array_contains_nulls(ArrayType *array)
int ArrayGetNItems(int ndim, const int *dims)
#define InvalidBlockNumber
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)
#define BufferGetPage(buffer)
#define PageIsAllVisible(page)
#define PageGetMaxOffsetNumber(page)
#define PageGetItemId(page, offsetNumber)
#define PageGetItem(page, itemId)
#define PageClearAllVisible(page)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define PG_RETURN_DATUM(x)
Datum heap_force_freeze(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(heap_force_kill)
Datum heap_force_kill(PG_FUNCTION_ARGS)
static int32 tidcmp(const void *a, const void *b)
static BlockNumber find_tids_one_page(ItemPointer tids, int ntids, OffsetNumber *next_start_ptr)
static Datum heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt)
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)
int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
#define ItemPointerGetBlockNumberNoCheck(pointer)
#define ItemPointerSet(pointer, blockNumber, offNum)
ItemPointerData * ItemPointer
#define ItemPointerGetOffsetNumberNoCheck(pointer)
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 buf, uint8 flags)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf)
#define VISIBILITYMAP_VALID_BITS
bool RecoveryInProgress(void)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)