70 #define BRIN_ALL_BLOCKRANGES InvalidBlockNumber 76 bool include_partial,
double *numSummarized,
double *numExisting);
177 heapBlk = (origHeapBlk / pagesPerRange) * pagesPerRange;
181 bool need_insert =
false;
195 heapBlk == origHeapBlk &&
213 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
214 errmsg(
"request for BRIN range summarization for index \"%s\" page %u was not recorded",
294 buf, off, origtup, origsz, newtup, newsz,
438 nnullkeys = (
int *) ptr;
470 keyattno - 1)->attcollation));
482 if (consistentFn[keyattno - 1].fn_oid ==
InvalidOid)
487 Assert(nkeys[keyattno - 1] == 0);
488 Assert(nnullkeys[keyattno - 1] == 0);
499 nullkeys[keyattno - 1][nnullkeys[keyattno - 1]] =
key;
500 nnullkeys[keyattno - 1]++;
504 keys[keyattno - 1][nkeys[keyattno - 1]] =
key;
505 nkeys[keyattno - 1]++;
529 bool gottuple =
false;
589 if (nkeys[attno - 1] == 0 && nnullkeys[attno - 1] == 0)
604 nnullkeys[attno - 1]))
624 if (!nkeys[attno - 1])
627 Assert((nkeys[attno - 1] > 0) &&
654 if (consistentFn[attno - 1].fn_nargs >= 4)
677 for (keyno = 0; keyno < nkeys[attno - 1]; keyno++)
680 keys[attno - 1][keyno]->sk_collation,
698 for (pageno = heapBlk;
721 return totalpages * 10;
729 ScanKey orderbys,
int norderbys)
740 memmove(scan->
keyData, scankey,
787 "brinbuildCallback: completed a range: %u--%u",
824 elog(
ERROR,
"index \"%s\" already contains data",
878 idxtuples = state->bs_numtuples;
1010 double numSummarized = 0;
1014 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1015 errmsg(
"recovery is in progress"),
1016 errhint(
"BRIN control functions cannot be executed during recovery.")));
1023 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1024 errmsg(
"block number out of range: %s", blk)));
1043 if (indexRel->
rd_rel->relkind != RELKIND_INDEX ||
1044 indexRel->
rd_rel->relam != BRIN_AM_OID)
1046 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1047 errmsg(
"\"%s\" is not a BRIN index",
1063 errmsg(
"could not open parent table of index \"%s\"",
1067 brinsummarize(indexRel, heapRel, heapBlk,
true, &numSummarized, NULL);
1091 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1092 errmsg(
"recovery is in progress"),
1093 errhint(
"BRIN control functions cannot be executed during recovery.")));
1100 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1101 errmsg(
"block number out of range: %s", blk)));
1120 if (indexRel->
rd_rel->relkind != RELKIND_INDEX ||
1121 indexRel->
rd_rel->relam != BRIN_AM_OID)
1123 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1124 errmsg(
"\"%s\" is not a BRIN index",
1140 errmsg(
"could not open parent table of index \"%s\"",
1165 int totalstored = 0;
1182 for (keyno = 0; keyno < tupdesc->
natts; keyno++)
1198 bdesc =
palloc(totalsize);
1205 for (keyno = 0; keyno < tupdesc->
natts; keyno++)
1206 bdesc->
bd_info[keyno] = opcinfo[keyno];
1334 heapBlk, phtup, phsz);
1375 heapBlk, scanNumBlks,
1397 heapBlk, state->bs_dtuple, &newsize);
1401 state->bs_rmAccess, heapBlk, phbuf, offset,
1402 phtup, phsz, newtup, newsize, samepage);
1422 elog(
ERROR,
"missing placeholder tuple");
1427 union_tuples(state->bs_bdesc, state->bs_dtuple, phtup);
1446 bool include_partial,
double *numSummarized,
double *numExisting)
1464 startBlk = (pageRange / pagesPerRange) * pagesPerRange;
1465 heapNumBlocks =
Min(heapNumBlocks, startBlk + pagesPerRange);
1467 if (startBlk > heapNumBlocks)
1478 for (; startBlk < heapNumBlocks; startBlk += pagesPerRange)
1490 if (!include_partial &&
1491 (startBlk + pagesPerRange > heapNumBlocks))
1515 *numSummarized += 1.0;
1520 *numExisting += 1.0;
1647 for (blkno = 0; blkno < nblocks; blkno++)
1674 bool modified =
false;
1730 for (keyno = 0; keyno < nnullkeys; keyno++)
void brin_free_desc(BrinDesc *bdesc)
IndexBulkDeleteResult * brinbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
ambeginscan_function ambeginscan
uint8 amparallelvacuumoptions
#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)
#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)
static bool add_values_to_range(Relation idxRel, BrinDesc *bdesc, BrinMemTuple *dtup, Datum *values, bool *nulls)
#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
bool brininsert(Relation idxRel, Datum *values, bool *nulls, ItemPointer heaptid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, IndexInfo *indexInfo)
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
TypeCacheEntry * oi_typcache[FLEXIBLE_ARRAY_MEMBER]
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)
#define BRIN_PROCNUM_OPTIONS
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)
bool brin_can_do_samepage_update(Buffer buffer, Size origsz, Size newsz)
amrescan_function amrescan
Datum datumCopy(Datum value, bool typByVal, int typLen)
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
#define ereport(elevel,...)
Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3)
bool amusemaintenanceworkmem
BlockNumber pagesPerRange
void brin_free_tuple(BrinTuple *tuple)
BrinDesc * brin_build_desc(Relation rel)
#define ShareUpdateExclusiveLock
amadjustmembers_function amadjustmembers
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 VACUUM_OPTION_PARALLEL_CLEANUP
#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)
static bool check_null_keys(BrinValues *bval, ScanKey *nullkeys, int nnullkeys)
Datum brinhandler(PG_FUNCTION_ARGS)
#define offsetof(type, field)
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
aminitparallelscan_function aminitparallelscan
#define PG_USED_FOR_ASSERTS_ONLY
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