74 elog(
ERROR,
"hash AM does not use P_NEW");
100 elog(
ERROR,
"hash AM does not use P_NEW");
139 elog(
ERROR,
"hash AM does not use P_NEW");
203 elog(
ERROR,
"hash AM does not use P_NEW");
205 elog(
ERROR,
"access to noncontiguous page in hash index \"%s\"",
209 if (blkno == nblocks)
213 elog(
ERROR,
"unexpected hash relation size: %u, should be %u",
239 int access,
int flags,
245 elog(
ERROR,
"hash AM does not use P_NEW");
343 elog(
ERROR,
"cannot initialize non-empty hash index \"%s\"",
359 data_width =
sizeof(
uint32);
417 for (i = 0; i < num_buckets; i++)
452 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
453 errmsg(
"out of overflow pages in hash index \"%s\"",
498 uint16 ffactor,
bool initpage)
516 dnumbuckets = num_tuples / ffactor;
517 if (dnumbuckets <= 2.0)
519 else if (dnumbuckets >= (
double) 0x40000000)
520 num_buckets = 0x40000000;
630 bool metap_update_masks =
false;
631 bool metap_update_splitpoint =
false;
760 maxbucket, highmask, lowmask, NULL, NULL,
true,
837 metap_update_masks =
true;
849 metap_update_splitpoint =
true;
911 if (metap_update_masks)
918 if (metap_update_splitpoint)
944 old_bucket, new_bucket,
945 buf_oblkno, buf_nblkno, NULL,
946 maxbucket, highmask, lowmask);
994 lastblock = firstblock + nblocks - 1;
1087 Size all_tups_size = 0;
1119 ooffnum <= omaxoffnum;
1148 maxbucket, highmask, lowmask);
1150 if (bucket == nbucket)
1192 for (i = 0; i < nitups; i++)
1198 nbuf =
_hash_addovflpage(rel, metabuf, nbuf, (nbuf == bucket_nbuf) ?
true :
false);
1203 itups[nitups++] = new_itup;
1204 all_tups_size += itemsz;
1211 Assert(bucket == obucket);
1218 if (obuf == bucket_obuf)
1239 if (nbuf == bucket_nbuf)
1245 for (i = 0; i < nitups; i++)
1328 maxbucket, highmask, lowmask, NULL, NULL,
true,
1390 if (nblkno == bucket_nblkno)
1399 noffnum <= nmaxoffnum;
1419 if (nbuf == bucket_nbuf)
1452 nbucket, obuf, bucket_nbuf, tidhtab,
1453 maxbucket, highmask, lowmask);
1501 if (force_refresh || rel->
rd_amcache == NULL)
1609 *cachedmetap = metap;
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)
void hash_destroy(HTAB *hashp)
void _hash_dropscanbuf(Relation rel, HashScanOpaque so)
RegProcedure hashm_procid
#define XLH_SPLIT_META_UPDATE_SPLITPOINT
void _hash_pageinit(Page page, Size size)
Bucket _hash_hashkey2bucket(uint32 hashkey, uint32 maxbucket, uint32 highmask, uint32 lowmask)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
struct SMgrRelationData * rd_smgr
Buffer _hash_getbuf_with_strategy(Relation rel, BlockNumber blkno, int access, int flags, BufferAccessStrategy bstrategy)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define END_CRIT_SECTION()
#define XLOG_HASH_INIT_BITMAP_PAGE
#define START_CRIT_SECTION()
int errcode(int sqlerrcode)
Buffer _hash_getbucketbuf_from_hashkey(Relation rel, uint32 hashkey, int access, HashMetaPage *cachedmetap)
#define MemSet(start, val, len)
static int pg_leftmost_one_pos32(uint32 word)
void hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, BlockNumber bucket_blkno, BufferAccessStrategy bstrategy, uint32 maxbucket, uint32 highmask, uint32 lowmask, double *tuples_removed, double *num_index_tuples, bool split_cleanup, IndexBulkDeleteCallback callback, void *callback_state)
void ReleaseBuffer(Buffer buffer)
Buffer _hash_getnewbuf(Relation rel, BlockNumber blkno, ForkNumber forkNum)
void _hash_dropbuf(Relation rel, Buffer buf)
Buffer _hash_getinitbuf(Relation rel, BlockNumber blkno)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
#define XLOG_HASH_SPLIT_PAGE
Buffer _hash_getbuf(Relation rel, BlockNumber blkno, int access, int flags)
#define BUFFER_LOCK_EXCLUSIVE
#define LH_BUCKET_NEEDS_SPLIT_CLEANUP
#define ItemIdIsDead(itemId)
#define PageGetMaxOffsetNumber(page)
#define HashGetTargetPageUsage(relation)
#define BUCKET_TO_BLKNO(metap, B)
#define HASH_MAX_SPLITPOINTS
static bool _hash_alloc_buckets(Relation rel, BlockNumber firstblock, uint32 nblocks)
#define HashGetMaxBitmapSize(page)
#define RelationOpenSmgr(relation)
void pfree(void *pointer)
void UnlockReleaseBuffer(Buffer buffer)
#define H_NEEDS_SPLIT_CLEANUP(opaque)
bool ConditionalLockBufferForCleanup(Buffer buffer)
BlockNumber hasho_prevblkno
#define SizeOfHashSplitAllocPage
uint32 _hash_get_indextuple_hashkey(IndexTuple itup)
#define SizeOfHashInitMetaPage
uint32 _hash_spareindex(uint32 num_bucket)
void _hash_init_metabuffer(Buffer buf, double num_tuples, RegProcedure procid, uint16 ffactor, bool initpage)
uint32 _hash_get_totalbuckets(uint32 splitpoint_phase)
#define SizeOfHashInitBitmapPage
void _hash_finish_split(Relation rel, Buffer metabuf, Buffer obuf, Bucket obucket, uint32 maxbucket, uint32 highmask, uint32 lowmask)
IndexTuple CopyIndexTuple(IndexTuple source)
#define FirstOffsetNumber
IndexTupleData * IndexTuple
static uint32 pg_nextpower2_32(uint32 num)
#define RelationGetRelationName(relation)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
#define LH_BUCKET_BEING_SPLIT
struct ItemIdData ItemIdData
MemoryContext CurrentMemoryContext
#define XLOG_HASH_INIT_META_PAGE
Buffer _hash_getbuf_with_condlock_cleanup(Relation rel, BlockNumber blkno, int flags)
void _hash_expandtable(Relation rel, Buffer metabuf)
#define HASHSTANDARD_PROC
#define BMPG_SHIFT(metap)
#define BufferGetPage(buffer)
bool IsBufferCleanupOK(Buffer buffer)
#define REGBUF_FORCE_IMAGE
#define PageGetItemId(page, offsetNumber)
void XLogRegisterData(char *data, int len)
#define LH_BUCKET_BEING_POPULATED
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void _hash_checkpage(Relation rel, Buffer buf, int flags)
bool hashso_buc_populated
#define BufferGetPageSize(buffer)
void LockBuffer(Buffer buffer, int mode)
uint32 hashm_spares[HASH_MAX_SPLITPOINTS]
Size PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
HashMetaPage _hash_getcachedmetap(Relation rel, Buffer *metabuf, bool force_refresh)
static void log_split_page(Relation rel, Buffer buf)
void _hash_relbuf(Relation rel, Buffer buf)
BlockNumber _hash_get_newblock_from_oldbucket(Relation rel, Bucket old_bucket)
#define ereport(elevel,...)
void _hash_initbitmapbuffer(Buffer buf, uint16 bmsize, bool initpage)
#define BlockNumberIsValid(blockNumber)
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
#define H_BUCKET_BEING_SPLIT(opaque)
PageHeaderData * PageHeader
static void _hash_splitbucket(Relation rel, Buffer metabuf, Bucket obucket, Bucket nbucket, Buffer obuf, Buffer nbuf, HTAB *htab, uint32 maxbucket, uint32 highmask, uint32 lowmask)
#define Assert(condition)
void _hash_initbuf(Buffer buf, uint32 max_bucket, uint32 num_bucket, uint32 flag, bool initpage)
#define SizeOfHashSplitComplete
struct ItemPointerData ItemPointerData
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
#define OffsetNumberNext(offsetNumber)
#define PageGetSpecialPointer(page)
#define InvalidBlockNumber
HashPageOpaqueData * HashPageOpaque
void PageSetChecksumInplace(Page page, BlockNumber blkno)
Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
#define BufferIsValid(bufnum)
#define RelationNeedsWAL(relation)
void smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, char *buffer, bool skipFsync)
#define XLOG_HASH_SPLIT_COMPLETE
uint32 _hash_init(Relation rel, double num_tuples, ForkNumber forkNum)
BlockNumber BufferGetBlockNumber(Buffer buffer)
#define XLOG_HASH_SPLIT_ALLOCATE_PAGE
#define MaxIndexTuplesPerPage
#define HashPageGetMeta(page)
int errmsg(const char *fmt,...)
void * MemoryContextAlloc(MemoryContext context, Size size)
XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum, BlockNumber blkno, Page page, bool page_std)
MemoryContext rd_indexcxt
Buffer hashso_split_bucket_buf
#define BUFFER_LOCK_SHARE
BlockNumber hasho_nextblkno
#define CHECK_FOR_INTERRUPTS()
#define XLH_SPLIT_META_UPDATE_MASKS
#define INDEX_MOVED_BY_SPLIT_MASK
void XLogBeginInsert(void)
#define PageSetLSN(page, lsn)
BlockNumber hashm_mapp[HASH_MAX_BITMAPS]
void PredicateLockPageSplit(Relation relation, BlockNumber oldblkno, BlockNumber newblkno)
#define PageGetItem(page, itemId)
#define IndexTupleSize(itup)
void PageInit(Page page, Size pageSize, Size specialSize)
RegProcedure index_getprocid(Relation irel, AttrNumber attnum, uint16 procnum)