86 gsvp.entries =
spl->splitVector.spl_left;
87 gsvp.len =
spl->splitVector.spl_nleft;
93 gsvp.entries =
spl->splitVector.spl_right;
94 gsvp.len =
spl->splitVector.spl_nright;
129 for (
i = 0;
i <
spl->splitVector.spl_nleft;
i++)
131 int j =
spl->splitVector.spl_left[
i];
132 float penalty =
gistpenalty(giststate, attno, &entry,
false,
137 spl->spl_dontcare[
j] =
true;
145 for (
i = 0;
i <
spl->splitVector.spl_nright;
i++)
147 int j =
spl->splitVector.spl_right[
i];
148 float penalty =
gistpenalty(giststate, attno, &entry,
false,
153 spl->spl_dontcare[
j] =
true;
180 if (dontcare[
ai] ==
false)
218 identry + attno, isnull[attno]);
221 identry + attno, isnull[attno]);
237#define SWAPVAR( s, d, t ) \
273 if (
sv->spl_ldatum_exists &&
sv->spl_rdatum_exists)
327 if (
sv->spl_ldatum_exists)
331 if (
sv->spl_rdatum_exists)
335 sv->spl_ldatum_exists =
sv->spl_rdatum_exists =
false;
438 if (
sv->spl_nleft == 0 ||
sv->spl_nright == 0)
446 errmsg(
"picksplit method for column %d of index \"%s\" failed",
448 errhint(
"The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command.")));
472 if (
sv->spl_ldatum_exists ||
sv->spl_rdatum_exists)
530 if (
sv->spl_nleft == 0 ||
sv->spl_nright == 0)
592 for (
i = 1;
i <=
len;
i++)
637 for (
i = 1;
i <=
len;
i++)
679 for (
i = 1;
i <=
len;
i++)
#define Assert(condition)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_array(type, count)
#define palloc0_array(type, count)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
#define gistentryinit(e, k, r, pg, o, l)
static void removeDontCares(OffsetNumber *a, int *len, const bool *dontcare)
static void supportSecondarySplit(Relation r, GISTSTATE *giststate, int attno, GIST_SPLITVEC *sv, Datum oldL, Datum oldR)
static void genericPickSplit(GISTSTATE *giststate, GistEntryVector *entryvec, GIST_SPLITVEC *v, int attno)
static void placeOne(Relation r, GISTSTATE *giststate, GistSplitVector *v, IndexTuple itup, OffsetNumber off, int attno)
static void gistunionsubkey(GISTSTATE *giststate, IndexTuple *itvec, GistSplitVector *spl)
void gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len, GISTSTATE *giststate, GistSplitVector *v, int attno)
static bool gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVector *v, IndexTuple *itup, int len, GISTSTATE *giststate)
static int findDontCares(Relation r, GISTSTATE *giststate, GISTENTRY *valvec, GistSplitVector *spl, int attno)
static void gistunionsubkeyvec(GISTSTATE *giststate, IndexTuple *itvec, GistSplitUnion *gsvp)
static void gistSplitHalf(GIST_SPLITVEC *v, int len)
void gistDeCompressAtt(GISTSTATE *giststate, Relation r, IndexTuple tuple, Page p, OffsetNumber o, GISTENTRY *attdata, bool *isnull)
void gistMakeUnionKey(GISTSTATE *giststate, int attno, GISTENTRY *entry1, bool isnull1, GISTENTRY *entry2, bool isnull2, Datum *dst, bool *dstisnull)
void gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, Datum *attr, bool *isnull)
bool gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b)
void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, Datum k, Relation r, Page pg, OffsetNumber o, bool l, bool isNull)
float gistpenalty(GISTSTATE *giststate, int attno, GISTENTRY *orig, bool isNullOrig, GISTENTRY *add, bool isNullAdd)
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
void pfree(void *pointer)
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static Datum PointerGetDatum(const void *X)
#define RelationGetRelationName(relation)
Oid supportCollation[INDEX_MAX_KEYS]
FmgrInfo unionFn[INDEX_MAX_KEYS]
FmgrInfo picksplitFn[INDEX_MAX_KEYS]
GIST_SPLITVEC splitVector
Datum spl_lattr[INDEX_MAX_KEYS]
bool spl_lisnull[INDEX_MAX_KEYS]
Datum spl_rattr[INDEX_MAX_KEYS]
bool spl_risnull[INDEX_MAX_KEYS]