34#include "utils/fmgrprotos.h"
41#define GIN_PAGE_FREESIZE \
42 ( (Size) BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(GinPageOpaqueData)) )
78 for (
i = 0;
i < ntuples;
i++)
89 elog(
ERROR,
"failed to add item to index page in \"%s\"",
122 data.ntuples = ntuples;
160 for (
i = 0;
i < ntuples;
i++)
390 elog(
ERROR,
"failed to add item to index page in \"%s\"",
497 &nentries, &categories);
504 elog(
ERROR,
"too many entries for GIN index");
535 for (
i = 0;
i < nentries;
i++)
630 for (
i = 0;
i <
data.ndeleted;
i++)
644 for (
i = 0;
i <
data.ndeleted;
i++)
655 for (
i = 0;
i <
data.ndeleted;
i++)
662 for (
i = 0;
i <
data.ndeleted;
i++)
749 ka->keys,
ka->categories,
ka->nvalues);
762 ka->keys,
ka->categories,
ka->nvalues);
852 blkno = metadata->
head;
863 "GIN insert cleanup temporary context",
1040 errmsg(
"recovery is in progress"),
1041 errhint(
"GIN pending list cannot be cleaned up during recovery.")));
1048 errmsg(
"\"%s\" is not a GIN index",
1059 errmsg(
"cannot access temporary indexes of other sessions")));
1066 memset(&stats, 0,
sizeof(stats));
1075 if (indexRel->
rd_index->indisvalid)
1085 errmsg(
"index \"%s\" is not valid",
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
Size PageGetExactFreeSpace(const PageData *page)
static bool PageIsEmpty(const PageData *page)
PageHeaderData * PageHeader
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define Assert(condition)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define repalloc_array(pointer, type, count)
#define palloc_array(type, count)
#define PG_RETURN_INT64(x)
#define GinGetPendingListCleanupSize(relation)
#define GIN_METAPAGE_BLKNO
#define GinPageHasFullRow(page)
#define GinPageGetOpaque(page)
signed char GinNullCategory
#define GinPageGetMeta(p)
#define GinPageIsDeleted(page)
#define GinPageSetFullRow(page)
void ginBeginBAScan(BuildAccumulator *accum)
ItemPointerData * ginGetBAEntry(BuildAccumulator *accum, OffsetNumber *attnum, Datum *key, GinNullCategory *category, uint32 *n)
void ginInsertBAEntries(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum *entries, GinNullCategory *categories, int32 nentries)
void ginInitBA(BuildAccumulator *accum)
IndexTuple GinFormTuple(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, Pointer data, Size dataSize, int nipd, bool errorTooBig)
#define GIN_PAGE_FREESIZE
static int32 writeListPage(Relation index, Buffer buffer, const IndexTuple *tuples, int32 ntuples, BlockNumber rightlink)
Datum gin_clean_pending_list(PG_FUNCTION_ARGS)
void ginInsertCleanup(GinState *ginstate, bool full_clean, bool fill_fsm, bool forceCleanup, IndexBulkDeleteResult *stats)
void ginHeapTupleFastCollect(GinState *ginstate, GinTupleCollector *collector, OffsetNumber attnum, Datum value, bool isNull, ItemPointer ht_ctid)
int gin_pending_list_limit
static void processPendingPage(BuildAccumulator *accum, KeyArray *ka, Page page, OffsetNumber startoff)
static void initKeyArray(KeyArray *keys, int32 maxvalues)
static void makeSublist(Relation index, IndexTuple *tuples, int32 ntuples, GinMetaPageData *res)
static void shiftList(Relation index, Buffer metabuffer, BlockNumber newHead, bool fill_fsm, IndexBulkDeleteResult *stats)
static void addDatum(KeyArray *keys, Datum datum, GinNullCategory category)
void ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector)
void ginEntryInsert(GinState *ginstate, OffsetNumber attnum, Datum key, GinNullCategory category, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats)
OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple)
Buffer GinNewBuffer(Relation index)
void GinInitBuffer(Buffer b, uint32 f)
Datum * ginExtractEntries(GinState *ginstate, OffsetNumber attnum, Datum value, bool isNull, int32 *nentries, GinNullCategory **categories)
Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple, GinNullCategory *category)
void initGinState(GinState *state, Relation index)
static MemoryContext opCtx
#define XLOG_GIN_UPDATE_META_PAGE
#define GIN_NDELETE_AT_ONCE
#define XLOG_GIN_INSERT_LISTPAGE
#define XLOG_GIN_DELETE_LISTPAGE
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void IndexFreeSpaceMapVacuum(Relation rel)
void RecordFreeIndexPage(Relation rel, BlockNumber freeBlock)
bool ItemPointerEquals(const ItemPointerData *pointer1, const ItemPointerData *pointer2)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
void MemoryContextReset(MemoryContext context)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define AmAutoVacuumWorkerProcess()
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static uint32 pg_nextpower2_32(uint32 num)
void CheckForSerializableConflictIn(Relation relation, const ItemPointerData *tid, BlockNumber blkno)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
#define RELATION_IS_OTHER_TEMP(relation)
BlockNumber nPendingPages
BlockNumber pages_deleted
GinNullCategory * categories
void vacuum_delay_point(bool is_analyze)
bool RecoveryInProgress(void)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)
void XLogEnsureRecordSpace(int max_block_id, int ndatas)