68 elog(
PANIC,
"failed to add tuple to page");
145 bool need_to_pin_buffer1;
146 bool need_to_pin_buffer2;
159 if (!need_to_pin_buffer1 && !need_to_pin_buffer2)
168 if (need_to_pin_buffer1)
170 if (need_to_pin_buffer2)
185 || (need_to_pin_buffer1 && need_to_pin_buffer2))
206 if (lockWaiters <= 0)
215 extraBlocks =
Min(512, lockWaiters * 20);
233 elog(
ERROR,
"page %u of relation \"%s\" should be empty but is not",
254 firstBlock = blockNum;
263 while (--extraBlocks > 0);
339 Size pageFreeSpace = 0,
355 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
356 errmsg(
"row is too big: size %zu, maximum size %zu",
410 targetBlock = nblocks - 1;
446 else if (otherBlock == targetBlock)
449 buffer = otherBuffer;
454 else if (otherBlock < targetBlock)
494 if (otherBuffer ==
InvalidBuffer || targetBlock <= otherBlock)
496 targetBlock, otherBlock, vmbuffer,
500 otherBlock, targetBlock, vmbuffer_other,
522 if (len + saveFreeSpace <= pageFreeSpace)
538 else if (otherBlock != targetBlock)
555 len + saveFreeSpace);
623 elog(
ERROR,
"page %u of relation \"%s\" should be empty but is not",
661 Assert(otherBuffer != buffer);
687 elog(
PANIC,
"tuple is too big: size %zu", len);
bool ConditionalLockRelationForExtension(Relation relation, LOCKMODE lockmode)
static PgChecksumMode mode
#define BUFFER_LOCK_UNLOCK
#define HEAP_XMAX_LOCK_ONLY
#define PageIsAllVisible(page)
int RelationExtensionLockWaiterCount(Relation relation)
void RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail)
#define HEAP_INSERT_FROZEN
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf)
void MarkBufferDirty(Buffer buffer)
HeapTupleHeaderData * HeapTupleHeader
#define RELATION_IS_LOCAL(relation)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define HeapTupleHeaderIsSpeculative(tup)
int errcode(int sqlerrcode)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
void ReleaseBuffer(Buffer buffer)
#define HEAP_XMAX_COMMITTED
#define BUFFER_LOCK_EXCLUSIVE
#define SizeOfPageHeaderData
#define PageGetMaxOffsetNumber(page)
#define RelationGetTargetBlock(relation)
void RelationPutHeapTuple(Relation relation, Buffer buffer, HeapTuple tuple, bool token)
static Buffer ReadBufferBI(Relation relation, BlockNumber targetBlock, ReadBufferMode mode, BulkInsertState bistate)
static void GetVisibilityMapPins(Relation relation, Buffer buffer1, Buffer buffer2, BlockNumber block1, BlockNumber block2, Buffer *vmbuffer1, Buffer *vmbuffer2)
void UnlockReleaseBuffer(Buffer buffer)
Size PageGetHeapFreeSpace(Page page)
Buffer RelationGetBufferForTuple(Relation relation, Size len, Buffer otherBuffer, int options, BulkInsertState bistate, Buffer *vmbuffer, Buffer *vmbuffer_other)
#define RelationGetRelationName(relation)
#define BufferGetPage(buffer)
bool ConditionalLockBuffer(Buffer buffer)
#define RelationGetTargetPageFreeSpace(relation, defaultff)
#define PageGetItemId(page, offsetNumber)
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
#define BufferGetPageSize(buffer)
void LockBuffer(Buffer buffer, int mode)
#define HEAP_KEYS_UPDATED
#define RelationGetNumberOfBlocks(reln)
#define HEAP_XMAX_IS_MULTI
#define InvalidOffsetNumber
#define ereport(elevel,...)
#define Assert(condition)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define RelationSetTargetBlock(relation, targblock)
#define InvalidBlockNumber
#define BufferIsValid(bufnum)
#define HEAP_INSERT_SKIP_FSM
BufferAccessStrategy strategy
BlockNumber BufferGetBlockNumber(Buffer buffer)
static void RelationAddExtraBlocks(Relation relation, BulkInsertState bistate)
int errmsg(const char *fmt,...)
BlockNumber GetPageWithFreeSpace(Relation rel, Size spaceNeeded)
bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer buf)
BlockNumber RecordAndGetPageWithFreeSpace(Relation rel, BlockNumber oldPage, Size oldSpaceAvail, Size spaceNeeded)
#define HEAP_DEFAULT_FILLFACTOR
void FreeSpaceMapVacuumRange(Relation rel, BlockNumber start, BlockNumber end)
void IncrBufferRefCount(Buffer buffer)
#define PageGetItem(page, itemId)
#define ItemPointerSet(pointer, blockNumber, offNum)
void PageInit(Page page, Size pageSize, Size specialSize)