67 elog(
ERROR,
"failed to find requested node %d in SPGiST inner tuple",
89 else if (offset > tuple->
nNodes)
90 elog(
ERROR,
"invalid offset for adding node to SPGiST inner tuple");
168 if (
PageAddItem(page, tuple, tuple->
size, itemno,
false,
false) != itemno)
169 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
224 leafTuple, leafTuple->
size,
257 leafTuple, leafTuple->
size,
268 xlrec.offnumLeaf = offnum;
276 leafTuple, leafTuple->
size,
278 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
368 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
it->tupstate);
398 bool replaceDead =
false;
445 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
it->tupstate);
452 size, &
xlrec.newPage);
465 for (
i = 0;
i < nDelete;
i++)
523 xlrec.nMoves = nDelete;
524 xlrec.replaceDead = replaceDead;
614 for (
i = 1;
i < limit;
i++)
676 int level,
bool isNulls,
bool isNew)
763 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
it->tupstate);
799 elog(
ERROR,
"unexpected SPGiST tuple state: %d",
it->tupstate);
817 memset(&out, 0,
sizeof(out));
826 index->rd_indcollation[0],
836 if (
state->leafTupDesc->natts > 1)
869 if (
state->leafTupDesc->natts > 1)
953 elog(
ERROR,
"inconsistent result of SPGiST picksplit function");
966 xlrec.initInner =
false;
1013 xlrec.initDest =
false;
1108 elog(
ERROR,
"failed to divide leaf tuple groups across pages");
1113 elog(
ERROR,
"failed to divide leaf tuple groups across pages");
1125 xlrec.initSrc = isNew;
1146 if (
state->isBuild &&
1152 xlrec.initSrc =
true;
1163 if (!
state->isBuild)
1273 xlrec.innerIsParent =
true;
1335 xlrec.initInner =
true;
1336 xlrec.innerIsParent =
false;
1342 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
1395 if (
xlrec.initInner)
1475 parent->
node = nodeN;
1485 elog(
ERROR,
"failed to find requested node %d in SPGiST inner tuple",
1512 int nodeN,
Datum nodeLabel)
1528 xlrec.parentBlk = -1;
1534 xlrec.newPage =
false;
1548 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
1584 elog(
ERROR,
"cannot enlarge root tuple any more");
1612 elog(
ERROR,
"SPGiST new buffer shouldn't be same as old buffer");
1619 xlrec.parentBlk = 0;
1621 xlrec.parentBlk = 1;
1623 xlrec.parentBlk = 2;
1656 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
1681 if (
xlrec.parentBlk == 2)
1731 elog(
ERROR,
"invalid number of prefix nodes: %d",
1736 elog(
ERROR,
"invalid child node number: %d",
1764 elog(
ERROR,
"SPGiST inner-tuple split must not produce longer prefix");
1786 xlrec.newPage =
false;
1817 current->
offnum,
false,
false);
1819 elog(
ERROR,
"failed to add item of size %u to SPGiST index page",
1832 xlrec.postfixBlkSame =
true;
1842 xlrec.postfixBlkSame =
false;
1957 if (
state->attType.attlen == -1)
1993 (isnull || !
state->config.longValuesOK))
1996 errmsg(
"index row size %zu exceeds maximum %zu for index \"%s\"",
2000 errhint(
"Values larger than a buffer page cannot be indexed.")));
2099 elog(
ERROR,
"SPGiST index page %u has wrong nulls flag",
2114 ¤t, &parent, isnull, isNew);
2135 leafTuple, level, isnull, isNew))
2183 memset(&out, 0,
sizeof(out));
2189 index->rd_indcollation[0],
2207 elog(
ERROR,
"cannot add a node to an allTheSame inner tuple");
2259 if (
state->config.longValuesOK && !isnull)
2273 errmsg(
"index row size %zu exceeds maximum %zu for index \"%s\"",
2277 errhint(
"Values larger than a buffer page cannot be indexed.")));
2290 elog(
ERROR,
"cannot add a node to an inner tuple without node labels");
2312 elog(
ERROR,
"unrecognized SPGiST choose result: %d",
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
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 void LockBuffer(Buffer buffer, BufferLockMode mode)
static bool BufferIsValid(Buffer bufnum)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
Size PageGetExactFreeSpace(const PageData *page)
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)
#define OidIsValid(objectId)
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)
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
#define PG_DETOAST_DATUM(datum)
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
RegProcedure index_getprocid(Relation irel, AttrNumber attnum, uint16 procnum)
static int pg_cmp_u16(uint16 a, uint16 b)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
#define MaxIndexTuplesPerPage
void pfree(void *pointer)
#define INTERRUPTS_CAN_BE_PROCESSED()
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define INTERRUPTS_PENDING_CONDITION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define FirstOffsetNumber
uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax)
pg_prng_state pg_global_prng_state
#define qsort(a, b, c, d)
static Datum PointerGetDatum(const void *X)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
static void spgAddNodeAction(Relation index, SpGistState *state, SpGistInnerTuple innerTuple, SPPageDesc *current, SPPageDesc *parent, int nodeN, Datum nodeLabel)
static void setRedirectionTuple(SPPageDesc *current, OffsetNumber position, BlockNumber blkno, OffsetNumber offnum)
static bool checkAllTheSame(spgPickSplitIn *in, spgPickSplitOut *out, bool tooBig, bool *includeNew)
static void spgSplitNodeAction(Relation index, SpGistState *state, SpGistInnerTuple innerTuple, SPPageDesc *current, spgChooseOut *out)
static SpGistInnerTuple addNode(SpGistState *state, SpGistInnerTuple tuple, Datum label, int offset)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
bool spgdoinsert(Relation index, SpGistState *state, const ItemPointerData *heapPtr, const Datum *datums, const bool *isnulls)
static void spgMatchNodeAction(Relation index, SpGistState *state, SpGistInnerTuple innerTuple, SPPageDesc *current, SPPageDesc *parent, int nodeN)
static bool doPickSplit(Relation index, SpGistState *state, SPPageDesc *current, SPPageDesc *parent, SpGistLeafTuple newLeafTuple, int level, bool isNulls, bool isNew)
void spgUpdateNodeLink(SpGistInnerTuple tup, int nodeN, BlockNumber blkno, OffsetNumber offset)
static void moveLeafs(Relation index, SpGistState *state, SPPageDesc *current, SPPageDesc *parent, SpGistLeafTuple newLeafTuple, bool isNulls)
static void saveNodeLink(Relation index, SPPageDesc *parent, BlockNumber blkno, OffsetNumber offnum)
static int checkSplitConditions(Relation index, SpGistState *state, SPPageDesc *current, int *nToSplit)
static void addLeafTuple(Relation index, SpGistState *state, SpGistLeafTuple leafTuple, SPPageDesc *current, SPPageDesc *parent, bool isNulls, bool isNew)
static int cmpOffsetNumbers(const void *a, const void *b)
#define SPGIST_COMPRESS_PROC
#define SPGIST_CHOOSE_PROC
#define SPGIST_PICKSPLIT_PROC
#define SPGIST_NULL_BLKNO
SpGistDeadTupleData * SpGistDeadTuple
SpGistInnerTupleData * SpGistInnerTuple
#define SpGistPageStoresNulls(page)
#define SGLT_GET_NEXTOFFSET(spgLeafTuple)
#define SPGIST_PLACEHOLDER
#define SGITITERATE(x, i, nt)
#define spgFirstIncludeColumn
#define SpGistPageIsLeaf(page)
#define SPGIST_METAPAGE_BLKNO
#define SGLT_SET_NEXTOFFSET(spgLeafTuple, offsetNumber)
#define SpGistBlockIsRoot(blkno)
struct SpGistLeafTupleData * SpGistLeafTuple
#define STORE_STATE(s, d)
#define SPGIST_PAGE_CAPACITY
#define SpGistPageGetOpaque(page)
#define GBUF_INNER_PARITY(x)
#define SPGIST_ROOT_BLKNO
#define SpGistPageGetFreeSpace(p, n)
OffsetNumber SpGistPageAddNewItem(SpGistState *state, Page page, const void *item, Size size, OffsetNumber *startOffset, bool errorOK)
Datum * spgExtractNodeLabels(SpGistState *state, SpGistInnerTuple innerTuple)
SpGistLeafTuple spgFormLeafTuple(SpGistState *state, const ItemPointerData *heapPtr, const Datum *datums, const bool *isnulls)
SpGistInnerTuple spgFormInnerTuple(SpGistState *state, bool hasPrefix, Datum prefix, int nNodes, SpGistNodeTuple *nodes)
void spgDeformLeafTuple(SpGistLeafTuple tup, TupleDesc tupleDescriptor, Datum *datums, bool *isnulls, bool keyColumnIsNull)
SpGistDeadTuple spgFormDeadTuple(SpGistState *state, int tupstate, BlockNumber blkno, OffsetNumber offnum)
void SpGistInitBuffer(Buffer b, uint16 f)
Buffer SpGistGetBuffer(Relation index, int flags, int needSpace, bool *isNew)
void SpGistSetLastUsedPage(Relation index, Buffer buffer)
Size SpGistGetLeafTupleSize(TupleDesc tupleDescriptor, const Datum *datums, const bool *isnulls)
SpGistNodeTuple spgFormNodeTuple(SpGistState *state, Datum label, bool isnull)
#define XLOG_SPGIST_SPLIT_TUPLE
#define SizeOfSpgxlogPickSplit
#define SizeOfSpgxlogMoveLeafs
#define XLOG_SPGIST_ADD_NODE
#define XLOG_SPGIST_ADD_LEAF
#define XLOG_SPGIST_MOVE_LEAFS
#define XLOG_SPGIST_PICKSPLIT
spgChooseResultType resultType
struct spgChooseOut::@54::@57 splitTuple
struct spgChooseOut::@54::@56 addNode
union spgChooseOut::@54 result
struct spgChooseOut::@54::@55 matchNode
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
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)