66 elog(
PANIC,
"failed to add tuple to page");
143 bool need_to_pin_buffer1;
144 bool need_to_pin_buffer2;
157 if (!need_to_pin_buffer1 && !need_to_pin_buffer2)
166 if (need_to_pin_buffer1)
168 if (need_to_pin_buffer2)
183 || (need_to_pin_buffer1 && need_to_pin_buffer2))
204 if (lockWaiters <= 0)
213 extraBlocks =
Min(512, lockWaiters * 20);
231 elog(
ERROR,
"page %u of relation \"%s\" should be empty but is not",
252 firstBlock = blockNum;
261 while (--extraBlocks > 0);
341 Size nearlyEmptyFreeSpace,
359 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
360 errmsg(
"row is too big: size %zu, maximum size %zu",
375 if (
len + saveFreeSpace > nearlyEmptyFreeSpace)
376 targetFreeSpace =
Max(
len, nearlyEmptyFreeSpace);
378 targetFreeSpace =
len + saveFreeSpace;
422 targetBlock = nblocks - 1;
457 else if (otherBlock == targetBlock)
460 buffer = otherBuffer;
465 else if (otherBlock < targetBlock)
505 if (otherBuffer ==
InvalidBuffer || targetBlock <= otherBlock)
507 targetBlock, otherBlock, vmbuffer,
511 otherBlock, targetBlock, vmbuffer_other,
533 if (targetFreeSpace <= pageFreeSpace)
549 else if (otherBlock != targetBlock)
634 elog(
ERROR,
"page %u of relation \"%s\" should be empty but is not",
672 Assert(otherBuffer != buffer);
674 Assert(targetBlock > otherBlock);
690 otherBlock, targetBlock, vmbuffer_other,
#define InvalidBlockNumber
void IncrBufferRefCount(Buffer buffer)
BlockNumber BufferGetBlockNumber(Buffer buffer)
bool ConditionalLockBuffer(Buffer buffer)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define BUFFER_LOCK_UNLOCK
#define BufferGetPageSize(buffer)
#define RelationGetNumberOfBlocks(reln)
#define BufferIsValid(bufnum)
#define BUFFER_LOCK_EXCLUSIVE
@ RBM_ZERO_AND_CLEANUP_LOCK
#define BufferGetPage(buffer)
Size PageGetHeapFreeSpace(Page page)
void PageInit(Page page, Size pageSize, Size specialSize)
#define PageIsAllVisible(page)
#define PageGetMaxOffsetNumber(page)
#define PageGetItemId(page, offsetNumber)
#define PageGetItem(page, itemId)
#define SizeOfPageHeaderData
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void FreeSpaceMapVacuumRange(Relation rel, BlockNumber start, BlockNumber end)
BlockNumber RecordAndGetPageWithFreeSpace(Relation rel, BlockNumber oldPage, Size oldSpaceAvail, Size spaceNeeded)
void RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail)
BlockNumber GetPageWithFreeSpace(Relation rel, Size spaceNeeded)
#define HEAP_INSERT_SKIP_FSM
#define HEAP_INSERT_FROZEN
void RelationPutHeapTuple(Relation relation, Buffer buffer, HeapTuple tuple, bool token)
static void GetVisibilityMapPins(Relation relation, Buffer buffer1, Buffer buffer2, BlockNumber block1, BlockNumber block2, Buffer *vmbuffer1, Buffer *vmbuffer2)
Buffer RelationGetBufferForTuple(Relation relation, Size len, Buffer otherBuffer, int options, BulkInsertState bistate, Buffer *vmbuffer, Buffer *vmbuffer_other)
static void RelationAddExtraBlocks(Relation relation, BulkInsertState bistate)
static Buffer ReadBufferBI(Relation relation, BlockNumber targetBlock, ReadBufferMode mode, BulkInsertState bistate)
HeapTupleHeaderData * HeapTupleHeader
#define HEAP_XMAX_IS_MULTI
#define HEAP_XMAX_COMMITTED
#define MaxHeapTuplesPerPage
#define HeapTupleHeaderIsSpeculative(tup)
struct ItemIdData ItemIdData
#define ItemPointerSet(pointer, blockNumber, offNum)
Assert(fmt[strlen(fmt) - 1] !='\n')
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
bool ConditionalLockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
int RelationExtensionLockWaiterCount(Relation relation)
#define InvalidOffsetNumber
static PgChecksumMode mode
#define RELATION_IS_LOCAL(relation)
#define RelationGetTargetPageFreeSpace(relation, defaultff)
#define RelationGetRelationName(relation)
#define RelationGetTargetBlock(relation)
#define RelationSetTargetBlock(relation, targblock)
#define HEAP_DEFAULT_FILLFACTOR
BufferAccessStrategy strategy
bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer buf)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf)