67 #define BRIN_ALL_BLOCKRANGES InvalidBlockNumber 73 bool include_partial,
double *numSummarized,
double *numExisting);
166 heapBlk = (origHeapBlk / pagesPerRange) * pagesPerRange;
170 bool need_insert =
false;
185 heapBlk == origHeapBlk &&
203 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
204 errmsg(
"request for BRIN range summarization for index \"%s\" page %u was not recorded",
308 buf, off, origtup, origsz, newtup, newsz,
426 bool gottuple =
false;
492 keyattno - 1)->attcollation));
495 if (consistentFn[keyattno - 1].fn_oid ==
InvalidOid)
532 for (pageno = heapBlk;
555 return totalpages * 10;
563 ScanKey orderbys,
int norderbys)
622 "brinbuildCallback: completed a range: %u--%u",
654 values[i], isnull[i]);
676 elog(
ERROR,
"index \"%s\" already contains data",
730 idxtuples = state->bs_numtuples;
862 double numSummarized = 0;
866 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
867 errmsg(
"recovery is in progress"),
868 errhint(
"BRIN control functions cannot be executed during recovery.")));
875 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
876 errmsg(
"block number out of range: %s", blk)));
895 if (indexRel->
rd_rel->relkind != RELKIND_INDEX ||
896 indexRel->
rd_rel->relam != BRIN_AM_OID)
898 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
899 errmsg(
"\"%s\" is not a BRIN index",
915 errmsg(
"could not open parent table of index %s",
919 brinsummarize(indexRel, heapRel, heapBlk,
true, &numSummarized, NULL);
943 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
944 errmsg(
"recovery is in progress"),
945 errhint(
"BRIN control functions cannot be executed during recovery.")));
952 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
953 errmsg(
"block number out of range: %s", blk)));
972 if (indexRel->
rd_rel->relkind != RELKIND_INDEX ||
973 indexRel->
rd_rel->relam != BRIN_AM_OID)
975 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
976 errmsg(
"\"%s\" is not a BRIN index",
992 errmsg(
"could not open parent table of index %s",
1017 int totalstored = 0;
1034 for (keyno = 0; keyno < tupdesc->
natts; keyno++)
1050 bdesc =
palloc(totalsize);
1057 for (keyno = 0; keyno < tupdesc->
natts; keyno++)
1058 bdesc->
bd_info[keyno] = opcinfo[keyno];
1186 heapBlk, phtup, phsz);
1227 heapBlk, scanNumBlks,
1249 heapBlk, state->bs_dtuple, &newsize);
1253 state->bs_rmAccess, heapBlk, phbuf, offset,
1254 phtup, phsz, newtup, newsize, samepage);
1274 elog(
ERROR,
"missing placeholder tuple");
1279 union_tuples(state->bs_bdesc, state->bs_dtuple, phtup);
1298 bool include_partial,
double *numSummarized,
double *numExisting)
1316 startBlk = (pageRange / pagesPerRange) * pagesPerRange;
1317 heapNumBlocks =
Min(heapNumBlocks, startBlk + pagesPerRange);
1319 if (startBlk > heapNumBlocks)
1330 for (; startBlk < heapNumBlocks; startBlk += pagesPerRange)
1342 if (!include_partial &&
1343 (startBlk + pagesPerRange > heapNumBlocks))
1367 *numSummarized += 1.0;
1372 *numExisting += 1.0;
1466 for (blkno = 0; blkno < nblocks; blkno++)
void brin_free_desc(BrinDesc *bdesc)
IndexBulkDeleteResult * brinbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
ambeginscan_function ambeginscan
#define PG_RETURN_POINTER(x)
bool AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, BlockNumber blkno)
#define BUFFER_LOCK_UNLOCK
Oid IndexGetRelation(Oid indexId, bool missing_ok)
ambulkdelete_function ambulkdelete
#define BRIN_CURRENT_VERSION
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define BRIN_METAPAGE_BLKNO
void table_close(Relation relation, LOCKMODE lockmode)
IndexBuildResult * brinbuild(Relation heap, Relation index, IndexInfo *indexInfo)
int errhint(const char *fmt,...)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)
bool brininsert(Relation idxRel, Datum *values, bool *nulls, ItemPointer heaptid, Relation heapRel, IndexUniqueCheck checkUnique, IndexInfo *indexInfo)
#define ERRCODE_UNDEFINED_TABLE
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
BrinTuple * brin_copy_tuple(BrinTuple *tuple, Size len, BrinTuple *dest, Size *destsz)
#define SizeOfBrinCreateIdx
amgettuple_function amgettuple
void RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail)
#define RelationGetDescr(relation)
void brinRevmapTerminate(BrinRevmap *revmap)
static void union_tuples(BrinDesc *bdesc, BrinMemTuple *a, BrinTuple *b)
amproperty_function amproperty
BrinTuple * brinGetTupleForHeapBlock(BrinRevmap *revmap, BlockNumber heapBlk, Buffer *buf, OffsetNumber *off, Size *size, int mode, Snapshot snapshot)
bool brinvalidate(Oid opclassoid)
void MarkBufferDirty(Buffer buffer)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
#define PointerGetDatum(X)
#define PG_GETARG_DATUM(n)
#define TupleDescAttr(tupdesc, i)
static void addrange(struct cvec *cv, chr from, chr to)
Buffer bs_currentInsertBuf
char * psprintf(const char *fmt,...)
#define ALLOCSET_SMALL_SIZES
static void summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel, BlockNumber heapBlk, BlockNumber heapNumBlks)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
amparallelrescan_function amparallelrescan
#define END_CRIT_SECTION()
BufferAccessStrategy strategy
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define XLOG_BRIN_CREATE_INDEX
#define PG_RETURN_INT32(x)
#define BRIN_PROCNUM_OPCINFO
int64 bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
#define START_CRIT_SECTION()
int errcode(int sqlerrcode)
struct SnapshotData * xs_snapshot
Datum FunctionCall4Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4)
static void form_and_insert_tuple(BrinBuildState *state)
void ReleaseBuffer(Buffer buffer)
aminsert_function aminsert
IndexInfo * BuildIndexInfo(Relation index)
#define BUFFER_LOCK_EXCLUSIVE
bool brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, BrinRevmap *revmap, BlockNumber heapBlk, Buffer oldbuf, OffsetNumber oldoff, const BrinTuple *origtup, Size origsz, const BrinTuple *newtup, Size newsz, bool samepage)
bool RecoveryInProgress(void)
BrinMemTuple * brin_new_memtuple(BrinDesc *brdesc)
#define BrinGetPagesPerRange(relation)
#define OidIsValid(objectId)
BlockNumber bs_currRangeStart
void brinendscan(IndexScanDesc scan)
amvalidate_function amvalidate
BlockNumber bo_pagesPerRange
Size PageGetFreeSpace(Page page)
void * build_reloptions(Datum reloptions, bool validate, relopt_kind kind, Size relopt_struct_size, const relopt_parse_elt *relopt_elems, int num_relopt_elems)
bytea * brinoptions(Datum reloptions, bool validate)
void brin_page_cleanup(Relation idxrel, Buffer buf)
OffsetNumber brin_doinsert(Relation idxrel, BlockNumber pagesPerRange, BrinRevmap *revmap, Buffer *buffer, BlockNumber heapBlk, BrinTuple *tup, Size itemsz)
Datum brin_summarize_range(PG_FUNCTION_ARGS)
BrinMemTuple * brin_deform_tuple(BrinDesc *brdesc, BrinTuple *tuple, BrinMemTuple *dMemtuple)
struct BrinOpaque BrinOpaque
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
#define BRIN_PROCNUM_ADDVALUE
BlockNumber bs_pagesPerRange
void pfree(void *pointer)
#define ItemIdGetLength(itemId)
amgetbitmap_function amgetbitmap
void brin_metapage_init(Page page, BlockNumber pagesPerRange, uint16 version)
void UnlockReleaseBuffer(Buffer buffer)
amoptions_function amoptions
static double table_index_build_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool progress, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
#define ALLOCSET_DEFAULT_SIZES
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
Datum brin_desummarize_range(PG_FUNCTION_ARGS)
amcostestimate_function amcostestimate
struct BrinBuildState BrinBuildState
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]
#define BufferIsInvalid(buffer)
amvacuumcleanup_function amvacuumcleanup
amendscan_function amendscan
static double table_index_build_range_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, bool allow_sync, bool anyvisible, bool progress, BlockNumber start_blockno, BlockNumber numblocks, IndexBuildCallback callback, void *callback_state, TableScanDesc scan)
#define FirstOffsetNumber
static void brin_vacuum_scan(Relation idxrel, BufferAccessStrategy strategy)
#define RelationGetRelationName(relation)
static void brinbuildCallback(Relation index, ItemPointer tid, Datum *values, bool *isnull, bool tupleIsAlive, void *brstate)
#define pgstat_count_index_scan(rel)
FormData_pg_attribute * Form_pg_attribute
void brinrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
MemoryContext CurrentMemoryContext
Datum Int64GetDatum(int64 X)
#define BufferGetPage(buffer)
static void brinsummarize(Relation index, Relation heapRel, BlockNumber pageRange, bool include_partial, double *numSummarized, double *numExisting)
#define ereport(elevel, rest)
bool brin_can_do_samepage_update(Buffer buffer, Size origsz, Size newsz)
amrescan_function amrescan
IndexScanDesc brinbeginscan(Relation r, int nkeys, int norderbys)
void FreeSpaceMapVacuum(Relation rel)
#define PageGetItemId(page, offsetNumber)
BlockNumber lastRevmapPage
void XLogRegisterData(char *data, int len)
#define MemoryContextResetAndDeleteChildren(ctx)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void * palloc0(Size size)
#define PageGetContents(page)
void LockBuffer(Buffer buffer, int mode)
#define RelationGetNumberOfBlocks(reln)
BrinOpcInfo * bd_info[FLEXIBLE_ARRAY_MEMBER]
BlockNumber pagesPerRange
Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3)
BlockNumber pagesPerRange
void brin_free_tuple(BrinTuple *tuple)
BrinDesc * brin_build_desc(Relation rel)
#define ShareUpdateExclusiveLock
void relation_close(Relation relation, LOCKMODE lockmode)
#define Assert(condition)
#define BRIN_PROCNUM_CONSISTENT
bool pg_class_ownercheck(Oid class_oid, Oid roleid)
bool brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
void brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, Cost *indexStartupCost, Cost *indexTotalCost, Selectivity *indexSelectivity, double *indexCorrelation, double *indexPages)
BrinRevmap * brinRevmapInitialize(Relation idxrel, BlockNumber *pagesPerRange, Snapshot snapshot)
#define BufferIsValid(bufnum)
#define ItemPointerGetOffsetNumber(pointer)
ammarkpos_function ammarkpos
ambuildphasename_function ambuildphasename
#define RelationNeedsWAL(relation)
amestimateparallelscan_function amestimateparallelscan
#define DatumGetPointer(X)
struct ScanKeyData * keyData
#define BRIN_ALL_BLOCKRANGES
#define BRIN_LAST_OPTIONAL_PROCNUM
static Datum values[MAXATTR]
#define BRIN_PROCNUM_UNION
BlockNumber BufferGetBlockNumber(Buffer buffer)
void tbm_add_page(TIDBitmap *tbm, BlockNumber pageno)
#define BrinGetAutoSummarize(relation)
int errmsg(const char *fmt,...)
BrinTuple * brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple, Size *size)
ambuildempty_function ambuildempty
#define FunctionCall1(flinfo, arg1)
#define BUFFER_LOCK_SHARE
IndexBulkDeleteResult * brinvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
BlockNumber pagesPerRange
IndexScanDesc RelationGetIndexScan(Relation indexRelation, int nkeys, int norderbys)
#define CHECK_FOR_INTERRUPTS()
Datum brin_summarize_new_values(PG_FUNCTION_ARGS)
static BrinBuildState * initialize_brin_buildstate(Relation idxRel, BrinRevmap *revmap, BlockNumber pagesPerRange)
void brinbuildempty(Relation index)
#define ItemPointerGetBlockNumber(pointer)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void XLogBeginInsert(void)
#define PG_GETARG_INT64(n)
#define PageSetLSN(page, lsn)
BrinTuple * brin_form_placeholder_tuple(BrinDesc *brdesc, BlockNumber blkno, Size *size)
amcanreturn_function amcanreturn
#define RelationGetRelid(relation)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void FreeSpaceMapVacuumRange(Relation rel, BlockNumber start, BlockNumber end)
#define DirectFunctionCall2(func, arg1, arg2)
Datum brinhandler(PG_FUNCTION_ARGS)
#define offsetof(type, field)
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
aminitparallelscan_function aminitparallelscan
BrinMemTuple * brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
void brinGetStats(Relation index, BrinStatsData *stats)
static void terminate_brin_buildstate(BrinBuildState *state)
BlockNumber revmapNumPages
amrestrpos_function amrestrpos