blob: 1597035fd0dcdb68c5b86197b3d3f7c2aa05547b [file] [log] [blame]
/*
* brin_revmap.h
* Prototypes for BRIN reverse range maps
*
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* src/include/access/brin_revmap.h
*/
#ifndef BRIN_REVMAP_H
#define BRIN_REVMAP_H
#include "access/brin_tuple.h"
#include "storage/block.h"
#include "storage/buf.h"
#include "storage/itemptr.h"
#include "storage/off.h"
#include "utils/relcache.h"
#include "utils/snapshot.h"
/*
* In revmap pages, each item stores an ItemPointerData. These defines let one
* find the logical revmap page number and index number of the revmap item for
* the given heap block number.
*/
#define HEAPBLK_TO_REVMAP_BLK(pagesPerRange, heapBlk) \
((heapBlk / pagesPerRange) / REVMAP_PAGE_MAXITEMS)
#define HEAPBLK_TO_REVMAP_INDEX(pagesPerRange, heapBlk) \
((heapBlk / pagesPerRange) % REVMAP_PAGE_MAXITEMS)
/*
* GPDB: Similar to the above calculation, except we need to normalize the
* provided heapBlk, with the starting block of the block sequence it belongs
* to. Also, logical page numbers are 1-based.
*/
#define HEAPBLK_TO_REVMAP_PAGENUM_AO(pagesPerRange, heapBlk) \
(((heapBlk - AOHeapBlockGet_startHeapBlock(heapBlk)) / pagesPerRange) / REVMAP_PAGE_MAXITEMS + 1)
/* struct definition lives in brin_revmap.c */
typedef struct BrinRevmap BrinRevmap;
extern BrinRevmap *brinRevmapInitialize(Relation idxrel,
BlockNumber *pagesPerRange, Snapshot snapshot);
extern void brinRevmapTerminate(BrinRevmap *revmap);
extern void brinRevmapExtend(BrinRevmap *revmap,
BlockNumber heapBlk);
extern Buffer brinLockRevmapPageForUpdate(BrinRevmap *revmap,
BlockNumber heapBlk);
extern void brinSetHeapBlockItemptr(Buffer buf, BlockNumber pagesPerRange,
BlockNumber heapBlk, ItemPointerData tid);
extern BrinTuple *brinGetTupleForHeapBlock(BrinRevmap *revmap,
BlockNumber heapBlk, Buffer *buf, OffsetNumber *off,
Size *size, int mode, Snapshot snapshot);
extern bool brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk);
/* GPDB specific */
extern void brinRevmapAOPositionAtStart(BrinRevmap *revmap, int seqNum);
extern void brinRevmapAOPositionAtEnd(BrinRevmap *revmap, int seqNum);
/*
* GPDB: Given a 'heapBlk', return the starting block number of the range in
* which 'heapBlk' lies.
* Note: We have to factor in BlockSequence limits when we do this calculation.
*/
static inline BlockNumber
brin_range_start_blk(BlockNumber heapBlk, bool isAO, BlockNumber pagesPerRange)
{
BlockNumber seqStartBlk = isAO ? AOHeapBlockGet_startHeapBlock(heapBlk) : 0;
BlockNumber rangeNum = ((heapBlk - seqStartBlk) / pagesPerRange);
return (rangeNum * pagesPerRange) + seqStartBlk;
}
#endif /* BRIN_REVMAP_H */