68 for (i = 1; i <= splitnum; i++)
81 bitnum <= metap->hashm_spares[i])
86 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
87 errmsg(
"invalid overflow block number %u", ovflblkno)));
133 bool page_found =
false;
190 first_page = orig_firstfree >>
BMPG_SHIFT(metap);
207 last_bit = max_ovflpg &
BMPG_MASK(metap);
212 Assert(i < metap->hashm_nmaps);
216 last_inpage = last_bit;
238 bitmap_page_bit =
bit;
282 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
283 errmsg(
"out of overflow pages in hash index \"%s\"",
327 SETBIT(freep, bitmap_page_bit);
460 elog(
ERROR,
"firstfreebit found no free bit");
512 bool update_metap =
false;
532 if (prevblkno == writeblkno)
558 bitmapbit = ovflbitno &
BMPG_MASK(metap);
561 elog(
ERROR,
"invalid overflow bit number %u", ovflbitno);
636 if (ovflbitno < metap->hashm_firstfree)
652 xlrec.
ntups = nitups;
663 if (!xlrec.is_prim_bucket_same_wrt)
671 for (i = 0; i < nitups; i++)
683 if (
BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt)
703 if (
BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt)
762 MemSet(freep, 0xFF, bmsize);
769 ((
PageHeader) pg)->pd_lower = ((
char *) freep + bmsize) - (
char *) pg;
823 wblkno = bucket_blkno;
874 Size all_tups_size = 0;
876 bool retain_pin =
false;
882 roffnum <= maxroffnum;
905 bool tups_moved =
false;
909 if (wblkno == bucket_blkno)
916 if (wblkno != rblkno)
925 Assert(nitups == ndeletable);
955 xlrec.
ntups = nitups;
965 if (!xlrec.is_prim_bucket_same_wrt)
971 for (i = 0; i < nitups; i++)
999 if (rblkno == wblkno)
1012 for (i = 0; i < nitups; i++)
1027 deletable[ndeletable++] = roffnum;
1035 tups_size[nitups++] = itemsz;
1036 all_tups_size += itemsz;
1055 tups_size, nitups, bstrategy);
1058 for (i = 0; i < nitups; i++)
1062 if (rblkno == wblkno)
1065 if (wblkno == bucket_blkno)
void XLogRegisterBufData(uint8 block_id, char *data, int len)
#define BUFFER_LOCK_UNLOCK
void _hash_pgaddmultitup(Relation rel, Buffer buf, IndexTuple *itups, OffsetNumber *itup_offsets, uint16 nitups)
#define PageIsEmpty(page)
#define HashPageGetBitmap(page)
static BlockNumber bitno_to_blkno(HashMetaPage metap, uint32 ovflbitnum)
void _hash_pageinit(Page page, Size size)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
Buffer _hash_getbuf_with_strategy(Relation rel, BlockNumber blkno, int access, int flags, BufferAccessStrategy bstrategy)
#define END_CRIT_SECTION()
#define START_CRIT_SECTION()
int errcode(int sqlerrcode)
#define MemSet(start, val, len)
Buffer _hash_getnewbuf(Relation rel, BlockNumber blkno, ForkNumber forkNum)
Buffer _hash_getinitbuf(Relation rel, BlockNumber blkno)
Buffer _hash_getbuf(Relation rel, BlockNumber blkno, int access, int flags)
#define BUFFER_LOCK_EXCLUSIVE
#define SizeOfHashMovePageContents
#define ItemIdIsDead(itemId)
#define PageGetMaxOffsetNumber(page)
bool is_prim_bucket_same_wrt
static uint32 _hash_firstfreebit(uint32 map)
void pfree(void *pointer)
#define SizeOfHashSqueezePage
BlockNumber hasho_prevblkno
#define XLOG_HASH_ADD_OVFL_PAGE
uint32 _hash_get_totalbuckets(uint32 splitpoint_phase)
IndexTuple CopyIndexTuple(IndexTuple source)
#define FirstOffsetNumber
IndexTupleData * IndexTuple
#define RelationGetRelationName(relation)
bool is_prim_bucket_same_wrt
#define BMPG_SHIFT(metap)
#define BufferGetPage(buffer)
#define HASH_XLOG_FREE_OVFL_BUFS
#define PageGetItemId(page, offsetNumber)
void XLogRegisterData(char *data, int len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void _hash_checkpage(Relation rel, Buffer buf, int flags)
#define XLOG_HASH_MOVE_PAGE_CONTENTS
#define BufferGetPageSize(buffer)
void LockBuffer(Buffer buffer, int mode)
uint32 hashm_spares[HASH_MAX_SPLITPOINTS]
Size PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
void _hash_relbuf(Relation rel, Buffer buf)
#define ereport(elevel,...)
void _hash_initbitmapbuffer(Buffer buf, uint16 bmsize, bool initpage)
#define BlockNumberIsValid(blockNumber)
PageHeaderData * PageHeader
Datum bit(PG_FUNCTION_ARGS)
#define Assert(condition)
bool is_prev_bucket_same_wrt
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
#define OffsetNumberNext(offsetNumber)
#define PageGetSpecialPointer(page)
#define InvalidBlockNumber
HashPageOpaqueData * HashPageOpaque
void XLogEnsureRecordSpace(int max_block_id, int ndatas)
Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
void _hash_squeezebucket(Relation rel, Bucket bucket, BlockNumber bucket_blkno, Buffer bucket_buf, BufferAccessStrategy bstrategy)
#define BufferIsValid(bufnum)
#define RelationNeedsWAL(relation)
uint32 _hash_ovflblkno_to_bitno(HashMetaPage metap, BlockNumber ovflblkno)
BlockNumber _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, Buffer wbuf, IndexTuple *itups, OffsetNumber *itup_offsets, Size *tups_size, uint16 nitups, BufferAccessStrategy bstrategy)
#define SizeOfHashAddOvflPage
BlockNumber BufferGetBlockNumber(Buffer buffer)
#define MaxIndexTuplesPerPage
#define HashPageGetMeta(page)
int errmsg(const char *fmt,...)
#define XLOG_HASH_SQUEEZE_PAGE
BlockNumber hasho_nextblkno
void XLogBeginInsert(void)
#define PageSetLSN(page, lsn)
BlockNumber hashm_mapp[HASH_MAX_BITMAPS]
#define BMPGSZ_BIT(metap)
#define PageGetItem(page, itemId)
#define IndexTupleSize(itup)
#define PG_USED_FOR_ASSERTS_ONLY