41 .
type = T_IndexAmRoutine,
46 .amcanorderbyop =
false,
48 .amconsistentequality =
false,
49 .amconsistentordering =
false,
50 .amcanbackward =
false,
52 .amcanmulticol =
true,
53 .amoptionalkey =
true,
54 .amsearcharray =
false,
55 .amsearchnulls =
false,
57 .amclusterable =
false,
59 .amcanparallel =
false,
60 .amcanbuildparallel =
true,
61 .amcaninclude =
false,
62 .amusemaintenanceworkmem =
true,
63 .amsummarizing =
false,
64 .amparallelvacuumoptions =
71 .aminsertcleanup = NULL,
76 .amgettreeheight = NULL,
89 .amestimateparallelscan = NULL,
90 .aminitparallelscan = NULL,
91 .amparallelrescan = NULL,
112 state->origTupdesc = origTupdesc;
114 for (
i = 0;
i < origTupdesc->
natts;
i++)
152 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
153 errmsg(
"could not identify a comparison function for type %s",
189 elog(
ERROR,
"missing GIN support function (%d or %d) for attribute %d of index \"%s\"",
202 state->canPartialMatch[
i] =
true;
206 state->canPartialMatch[
i] =
false;
224 state->supportCollation[
i] = DEFAULT_COLLATION_OID;
399 if (categorya != categoryb)
400 return (categorya < categoryb) ? -1 : 1;
421 if (attnuma != attnumb)
422 return (attnuma < attnumb) ? -1 : 1;
476 data->haveDups =
true;
505 entries[0] = (
Datum) 0;
523 if (entries == NULL || *nentries <= 0)
527 entries[0] = (
Datum) 0;
537 if (nullFlags == NULL)
538 nullFlags = (
bool *)
palloc0(*nentries *
sizeof(
bool));
553 for (
i = 0;
i < *nentries;
i++)
561 arg.haveDups =
false;
570 entries[0] = keydata[0].
datum;
571 nullFlags[0] = keydata[0].
isnull;
573 for (
i = 1;
i < *nentries;
i++)
587 for (
i = 0;
i < *nentries;
i++)
601 for (
i = 0;
i < *nentries;
i++)
613 pendingListCleanupSize)}
718 return "initializing";
720 return "scanning table";
722 return "sorting tuples (workers)";
724 return "merging tuples (workers)";
726 return "sorting tuples";
728 return "merging tuples";
static bool validate(Port *port, const char *auth)
#define InvalidBlockNumber
void LockBuffer(Buffer buffer, BufferLockMode mode)
Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags)
bool ConditionalLockBuffer(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 Size BufferGetPageSize(Buffer buffer)
void PageInit(Page page, Size pageSize, Size specialSize)
PageHeaderData * PageHeader
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define MemSet(start, val, len)
#define OidIsValid(objectId)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_object(type)
#define palloc_array(type, count)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3)
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
#define PG_RETURN_POINTER(x)
#define GIN_CONSISTENT_PROC
#define PROGRESS_GIN_PHASE_PERFORMSORT_2
#define PROGRESS_GIN_PHASE_MERGE_1
#define PROGRESS_GIN_PHASE_PERFORMSORT_1
#define GIN_EXTRACTQUERY_PROC
#define GIN_EXTRACTVALUE_PROC
#define PROGRESS_GIN_PHASE_MERGE_2
#define GIN_TRICONSISTENT_PROC
#define GIN_COMPARE_PARTIAL_PROC
#define PROGRESS_GIN_PHASE_INDEXBUILD_TABLESCAN
#define GIN_CURRENT_VERSION
#define GIN_METAPAGE_BLKNO
#define GinGetNullCategory(itup, ginstate)
#define GinPageGetOpaque(page)
#define GIN_CAT_EMPTY_ITEM
signed char GinNullCategory
#define GIN_CAT_NULL_ITEM
#define GinPageGetMeta(p)
int64 gingetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
IndexBuildResult * ginbuild(Relation heap, Relation index, IndexInfo *indexInfo)
void ginbuildempty(Relation index)
bool gininsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, IndexInfo *indexInfo)
IndexScanDesc ginbeginscan(Relation rel, int nkeys, int norderbys)
void ginendscan(IndexScanDesc scan)
void ginrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
void GinInitPage(Page page, uint32 f, Size pageSize)
bytea * ginoptions(Datum reloptions, bool validate)
Datum ginhandler(PG_FUNCTION_ARGS)
void ginGetStats(Relation index, GinStatsData *stats)
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)
int ginCompareAttEntries(GinState *ginstate, OffsetNumber attnuma, Datum a, GinNullCategory categorya, OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
Datum gintuple_get_key(GinState *ginstate, IndexTuple tuple, GinNullCategory *category)
void GinInitMetabuffer(Buffer b)
static int cmpEntries(const void *a, const void *b, void *arg)
char * ginbuildphasename(int64 phasenum)
void initGinState(GinState *state, Relation index)
int ginCompareEntries(GinState *ginstate, OffsetNumber attnum, Datum a, GinNullCategory categorya, Datum b, GinNullCategory categoryb)
void ginUpdateStats(Relation index, const GinStatsData *stats, bool is_build)
bool GinPageIsRecyclable(Page page)
IndexBulkDeleteResult * ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
IndexBulkDeleteResult * ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
bool ginvalidate(Oid opclassoid)
void ginadjustmembers(Oid opfamilyoid, Oid opclassoid, List *operators, List *functions)
#define XLOG_GIN_UPDATE_META_PAGE
Assert(PointerIsAligned(start, uint64))
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
RegProcedure index_getprocid(Relation irel, AttrNumber attnum, uint16 procnum)
BlockNumber GetFreeIndexPage(Relation rel)
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
FormData_pg_attribute * Form_pg_attribute
void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
static Datum PointerGetDatum(const void *X)
static uint16 DatumGetUInt16(Datum X)
static Pointer DatumGetPointer(Datum X)
static int32 DatumGetInt32(Datum X)
#define PROGRESS_CREATEIDX_SUBPHASE_INITIALIZE
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
void * build_reloptions(Datum reloptions, bool validate, relopt_kind kind, Size relopt_struct_size, const relopt_parse_elt *relopt_elems, int num_relopt_elems)
void gincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, Cost *indexStartupCost, Cost *indexTotalCost, Selectivity *indexSelectivity, double *indexCorrelation, double *indexPages)
BlockNumber nPendingPages
TupleDesc tupdesc[INDEX_MAX_KEYS]
FmgrInfo extractValueFn[INDEX_MAX_KEYS]
Oid supportCollation[INDEX_MAX_KEYS]
FmgrInfo compareFn[INDEX_MAX_KEYS]
BlockNumber nPendingPages
TupleDesc CreateTemplateTupleDesc(int natts)
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define TYPECACHE_CMP_PROC_FINFO
#define VACUUM_OPTION_PARALLEL_CLEANUP
#define VACUUM_OPTION_PARALLEL_BULKDEL
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)