38 for (i = 0; i < len; i++)
44 elog(
ERROR,
"failed to add item to GiST index page, item %d out of %d, size %d bytes",
56 unsigned int size = freespace,
60 for (i = 0; i < len; i++)
79 for (i = 0; i < len; i++)
130 for (i = 0; i < veclen; i++)
133 ptr = ret =
palloc(*memlen);
135 for (i = 0; i < veclen; i++)
151 Datum *attr,
bool *isnull)
165 for (j = 0; j < len; j++)
230 Datum *dst,
bool *dstisnull)
243 if (isnull1 && isnull2)
252 evec->
vector[0] = *entry1;
253 evec->
vector[1] = *entry2;
255 else if (isnull1 ==
FALSE)
257 evec->
vector[0] = *entry1;
258 evec->
vector[1] = *entry1;
262 evec->
vector[0] = *entry2;
263 evec->
vector[1] = *entry2;
312 bool neednew =
FALSE;
331 oldentries + i, oldisnull[i],
332 addentries + i, addisnull[i],
333 attr + i, isnull + i);
346 !
gistKeyIsEQ(giststate, i, oldentries[i].key, attr[i]))
378 int keep_current_best;
399 best_penalty[0] = -1;
424 keep_current_best = -1;
452 &identry[j], isnull[j]);
454 zero_penalty =
false;
456 if (best_penalty[j] < 0 || usize < best_penalty[j])
467 best_penalty[j] = usize;
469 if (j < r->rd_att->natts - 1)
470 best_penalty[j + 1] = -1;
473 keep_current_best = -1;
475 else if (best_penalty[j] == usize)
490 zero_penalty =
false;
501 if (keep_current_best == -1)
506 if (keep_current_best == 0)
511 keep_current_best = -1;
523 if (keep_current_best == -1)
528 if (keep_current_best == 1)
564 Datum attdata[],
bool isnull[],
bool isleaf)
588 compatt[
i] = cep->
key;
679 if (isnan(penalty) || penalty < 0.0)
682 else if (isNullOrig && isNullAdd)
731 (
errcode(ERRCODE_INDEX_CORRUPTED),
732 errmsg(
"index \"%s\" contains unexpected zero page at block %u",
735 errhint(
"Please REINDEX it.")));
742 (
errcode(ERRCODE_INDEX_CORRUPTED),
743 errmsg(
"index \"%s\" contains corrupted page at block %u",
746 errhint(
"Please REINDEX it.")));
836 return (
bytea *) rdopts;
static Datum gistFetchAtt(GISTSTATE *giststate, int nkey, Datum k, Relation r)
#define GistPageIsDeleted(page)
#define PageIsEmpty(page)
int errhint(const char *fmt,...)
OffsetNumber PageAddItem(Page page, Item item, Size size, OffsetNumber offsetNumber, bool overwrite, bool is_heap)
#define RELPERSISTENCE_UNLOGGED
FmgrInfo fetchFn[INDEX_MAX_KEYS]
Oid supportCollation[INDEX_MAX_KEYS]
#define PointerGetDatum(X)
FmgrInfo compressFn[INDEX_MAX_KEYS]
void gistDeCompressAtt(GISTSTATE *giststate, Relation r, IndexTuple tuple, Page p, OffsetNumber o, GISTENTRY *attdata, bool *isnull)
FmgrInfo equalFn[INDEX_MAX_KEYS]
#define RELATION_IS_LOCAL(relation)
void gistfillbuffer(Page page, IndexTuple *itup, int len, OffsetNumber off)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
IndexTuple gistFetchTuple(GISTSTATE *giststate, Relation r, IndexTuple tuple)
int errcode(int sqlerrcode)
void ReleaseBuffer(Buffer buffer)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
bytea * gistoptions(Datum reloptions, bool validate)
#define PageGetMaxOffsetNumber(page)
IndexTuple gistgetadjusted(Relation r, IndexTuple oldtup, IndexTuple addtup, GISTSTATE *giststate)
XLogRecPtr gistGetFakeLSN(Relation rel)
Size PageGetFreeSpace(Page page)
bool gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b)
float get_float4_infinity(void)
GISTENTRY vector[FLEXIBLE_ARRAY_MEMBER]
IndexTuple index_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
IndexTuple * gistextractpage(Page page, int *len)
void pfree(void *pointer)
float gistpenalty(GISTSTATE *giststate, int attno, GISTENTRY *orig, bool isNullOrig, GISTENTRY *add, bool isNullAdd)
void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, Datum k, Relation r, Page pg, OffsetNumber o, bool l, bool isNull)
struct GISTENTRY GISTENTRY
XLogRecPtr GetFakeLSNForUnloggedRel(void)
void * allocateReloptStruct(Size base, relopt_value *options, int numoptions)
#define FirstOffsetNumber
IndexTupleData * IndexTuple
bool gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete, Size freespace)
#define RelationGetRelationName(relation)
FmgrInfo penaltyFn[INDEX_MAX_KEYS]
struct ItemIdData ItemIdData
#define BufferGetPage(buffer)
#define ereport(elevel, rest)
FmgrInfo decompressFn[INDEX_MAX_KEYS]
bool ConditionalLockBuffer(Buffer buffer)
OffsetNumber gistchoose(Relation r, Page p, IndexTuple it, GISTSTATE *giststate)
#define GistPageIsLeaf(page)
void fillRelOptions(void *rdopts, Size basesize, relopt_value *options, int numoptions, bool validate, const relopt_parse_elt *elems, int numelems)
#define PageGetItemId(page, offsetNumber)
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
IndexTuple * gistjoinvector(IndexTuple *itvec, int *len, IndexTuple *additvec, int addlen)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
#define BufferGetPageSize(buffer)
void LockBuffer(Buffer buffer, int mode)
#define InvalidOffsetNumber
Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3)
BlockNumber GetFreeIndexPage(Relation rel)
bool gistfitpage(IndexTuple *itvec, int len)
#define GistPageGetOpaque(page)
void gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, Datum *attr, bool *isnull)
#define Assert(condition)
#define gistentryinit(e, k, r, pg, o, l)
void gistcheckpage(Relation rel, Buffer buf)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
void gistMakeUnionKey(GISTSTATE *giststate, int attno, GISTENTRY *entry1, bool isnull1, GISTENTRY *entry2, bool isnull2, Datum *dst, bool *dstisnull)
#define OffsetNumberNext(offsetNumber)
IndexTupleData * gistfillitupvec(IndexTuple *vec, int veclen, int *memlen)
#define InvalidBlockNumber
#define index_getattr(tup, attnum, tupleDesc, isnull)
#define PageGetSpecialSize(page)
void * repalloc(void *pointer, Size size)
#define DatumGetPointer(X)
#define ItemPointerSetOffsetNumber(pointer, offsetNumber)
BlockNumber BufferGetBlockNumber(Buffer buffer)
IndexTuple gistunion(Relation r, IndexTuple *itvec, int len, GISTSTATE *giststate)
int errmsg(const char *fmt,...)
void GISTInitBuffer(Buffer b, uint32 f)
IndexTuple gistFormTuple(GISTSTATE *giststate, Relation r, Datum attdata[], bool isnull[], bool isleaf)
relopt_value * parseRelOptions(Datum options, bool validate, relopt_kind kind, int *numrelopts)
#define RELPERSISTENCE_TEMP
FmgrInfo unionFn[INDEX_MAX_KEYS]
Buffer gistNewBuffer(Relation r)
#define offsetof(type, field)
#define PageGetItem(page, itemId)
#define IndexTupleSize(itup)
void PageInit(Page page, Size pageSize, Size specialSize)