143 stack_in, page_access);
184 stack_in = new_stack;
253 Assert(!forupdate || heaprel != NULL);
272 cmpval =
key->nextkey ? 0 : 1;
317 elog(
ERROR,
"fell off the end of index \"%s\"",
389 cmpval =
key->nextkey ? 0 : 1;
399 if (result >= cmpval)
501 low = insertstate->
low;
539 if (result >= cmpval)
564 (
errcode(ERRCODE_INDEX_CORRUPTED),
565 errmsg_internal(
"table tid from new index tuple (%u,%u) cannot find insert offset between offsets %u and %u of block %u in index \"%s\"",
586 insertstate->
low = low;
644 mid = low + ((high - low) / 2);
728 ncmpkey =
Min(ntupatts,
key->keysz);
731 scankey =
key->scankeys;
732 for (
int i = 1;
i <= ncmpkey;
i++)
790 if (
key->keysz > ntupatts)
799 if (
key->scantid == NULL)
824 if (!
key->backward &&
key->keysz == ntupatts && heapTid == NULL &&
1052 for (
int i = 0;;
cur++,
i++)
1068 if (chosen != NULL &&
1071 int ikey = chosen - so->
keyData;
1072 ScanKey skipequalitykey = chosen;
1075 for (
int arridx = 0; arridx < so->
numArrayKeys; arridx++)
1097 impliesNN = skipequalitykey;
1099 Assert(chosen == NULL && impliesNN == NULL);
1106 if (chosen == NULL && impliesNN != NULL &&
1112 chosen = ¬nullkeys[keysz];
1133 startKeys[keysz++] = chosen;
1183 cur->sk_attno != curattr + 1)
1189 curattr =
cur->sk_attno;
1201 switch (
cur->sk_strategy)
1249 for (
int i = 0;
i < keysz;
i++)
1275 memcpy(inskey.scankeys +
i, subkey,
sizeof(
ScanKeyData));
1293 bool used_all_subkeys =
false;
1307 memcpy(inskey.scankeys + keysz, subkey,
1312 used_all_subkeys =
true;
1316 if (!used_all_subkeys)
1318 switch (strat_total)
1372 elog(
ERROR,
"missing support function %d(%u,%u) for attribute %d of index \"%s\"",
1395 inskey.anynullkeys =
false;
1396 inskey.scantid = NULL;
1397 inskey.keysz = keysz;
1398 switch (strat_total)
1402 inskey.nextkey =
false;
1403 inskey.backward =
true;
1408 inskey.nextkey =
true;
1409 inskey.backward =
true;
1423 inskey.nextkey =
true;
1424 inskey.backward =
true;
1431 inskey.nextkey =
false;
1432 inskey.backward =
false;
1441 inskey.nextkey =
false;
1442 inskey.backward =
false;
1450 inskey.nextkey =
true;
1451 inskey.backward =
false;
1456 elog(
ERROR,
"unrecognized strat_total: %d", (
int) strat_total);
1646 pstate.minoff = minoff;
1647 pstate.maxoff = maxoff;
1648 pstate.finaltup = NULL;
1650 pstate.firstpage = firstpage;
1651 pstate.forcenonrequired =
false;
1652 pstate.startikey = 0;
1655 pstate.continuescan =
true;
1656 pstate.rechecks = 0;
1657 pstate.targetdistance = 0;
1658 pstate.nskipadvances = 0;
1691 if (!pstate.firstpage && minoff < maxoff)
1697 offnum =
Max(offnum, minoff);
1699 while (offnum <= maxoff)
1718 pstate.offnum = offnum;
1728 Assert(!passes_quals && pstate.continuescan);
1729 Assert(offnum < pstate.skip);
1730 Assert(!pstate.forcenonrequired);
1732 offnum = pstate.skip;
1770 if (!pstate.continuescan)
1794 pstate.forcenonrequired =
false;
1795 pstate.startikey = 0;
1799 if (!pstate.continuescan)
1838 if (!pstate.firstpage && minoff < maxoff)
1844 offnum =
Min(offnum, maxoff);
1846 while (offnum >= minoff)
1865 if (offnum > minoff)
1871 tuple_alive =
false;
1879 pstate.offnum = offnum;
1880 if (arrayKeys && offnum == minoff && pstate.forcenonrequired)
1882 pstate.forcenonrequired =
false;
1883 pstate.startikey = 0;
1897 Assert(!passes_quals && pstate.continuescan);
1898 Assert(!pstate.forcenonrequired);
1909 Assert(!passes_quals && pstate.continuescan);
1910 Assert(offnum > pstate.skip);
1911 Assert(!pstate.forcenonrequired);
1913 offnum = pstate.skip;
1918 if (passes_quals && tuple_alive)
1957 if (!pstate.continuescan)
1967 if (!pstate.continuescan)
1988 Assert(!pstate.forcenonrequired);
2043 memcpy(base, itup, itupsz);
2045 base->
t_info &= ~INDEX_SIZE_MASK;
2369 lastcurrblkno = blkno;
2501 elog(
ERROR,
"fell off the end of index \"%s\"",
2519 elog(
ERROR,
"could not find left sibling of block %u in index \"%s\"",
2591 elog(
ERROR,
"fell off the end of index \"%s\"",
2603 (
errcode(ERRCODE_INDEX_CORRUPTED),
2683 elog(
ERROR,
"invalid scan direction: %d", (
int) dir);
#define InvalidBlockNumber
void IncrBufferRefCount(Buffer buffer)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void ReleaseBuffer(Buffer buffer)
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define RegProcedureIsValid(p)
#define INVERT_COMPARE_RESULT(var)
int errmsg_internal(const char *fmt,...)
int errcode(int sqlerrcode)
#define ereport(elevel,...)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
Assert(PointerIsAligned(start, uint64))
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
if(TABLE==NULL||TABLE_index==NULL)
#define ItemIdIsDead(itemId)
int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static Size IndexTupleSize(const IndexTupleData *itup)
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
#define CHECK_FOR_INTERRUPTS()
void _bt_finish_split(Relation rel, Relation heaprel, Buffer lbuf, BTStack stack)
Buffer _bt_relandgetbuf(Relation rel, Buffer obuf, BlockNumber blkno, int access)
void _bt_relbuf(Relation rel, Buffer buf)
Buffer _bt_gettrueroot(Relation rel)
void _bt_metaversion(Relation rel, bool *heapkeyspace, bool *allequalimage)
Buffer _bt_getbuf(Relation rel, BlockNumber blkno, int access)
void _bt_unlockbuf(Relation rel, Buffer buf)
void _bt_lockbuf(Relation rel, Buffer buf, int access)
Buffer _bt_getroot(Relation rel, Relation heaprel, int access)
void _bt_preprocess_keys(IndexScanDesc scan)
void _bt_parallel_primscan_schedule(IndexScanDesc scan, BlockNumber curr_page)
bool _bt_parallel_seize(IndexScanDesc scan, BlockNumber *next_scan_page, BlockNumber *last_curr_page, bool first)
void _bt_parallel_done(IndexScanDesc scan)
void _bt_parallel_release(IndexScanDesc scan, BlockNumber next_scan_page, BlockNumber curr_page)
#define BTScanPosIsPinned(scanpos)
static uint16 BTreeTupleGetNPosting(IndexTuple posting)
static bool BTreeTupleIsPivot(IndexTuple itup)
#define P_LEFTMOST(opaque)
#define BTPageGetOpaque(page)
#define P_ISDELETED(opaque)
#define MaxTIDsPerBTreePage
#define BTScanPosIsValid(scanpos)
#define P_FIRSTDATAKEY(opaque)
static uint32 BTreeTupleGetPostingOffset(IndexTuple posting)
#define P_RIGHTMOST(opaque)
#define SK_BT_NULLS_FIRST
#define P_INCOMPLETE_SPLIT(opaque)
static ItemPointer BTreeTupleGetPostingN(IndexTuple posting, int n)
static BlockNumber BTreeTupleGetDownLink(IndexTuple pivot)
static ItemPointer BTreeTupleGetMaxHeapTID(IndexTuple itup)
static bool BTreeTupleIsPosting(IndexTuple itup)
#define BTScanPosInvalidate(scanpos)
#define BTScanPosUnpinIfPinned(scanpos)
static ItemPointer BTreeTupleGetHeapTID(IndexTuple itup)
#define BTreeTupleGetNAtts(itup, rel)
BTScanOpaqueData * BTScanOpaque
Buffer _bt_get_endpoint(Relation rel, uint32 level, bool rightmost)
static Buffer _bt_moveright(Relation rel, Relation heaprel, BTScanInsert key, Buffer buf, bool forupdate, BTStack stack, int access)
static int _bt_binsrch_posting(BTScanInsert key, Page page, OffsetNumber offnum)
bool _bt_first(IndexScanDesc scan, ScanDirection dir)
static void _bt_saveitem(BTScanOpaque so, int itemIndex, OffsetNumber offnum, IndexTuple itup)
static int _bt_setuppostingitems(BTScanOpaque so, int itemIndex, OffsetNumber offnum, ItemPointer heapTid, IndexTuple itup)
static bool _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, BlockNumber lastcurrblkno, ScanDirection dir, bool seized)
static void _bt_drop_lock_and_maybe_pin(IndexScanDesc scan, BTScanPos sp)
static bool _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum, bool firstpage)
static OffsetNumber _bt_binsrch(Relation rel, BTScanInsert key, Buffer buf)
static bool _bt_endpoint(IndexScanDesc scan, ScanDirection dir)
static bool _bt_steppage(IndexScanDesc scan, ScanDirection dir)
static bool _bt_readfirstpage(IndexScanDesc scan, OffsetNumber offnum, ScanDirection dir)
static Buffer _bt_lock_and_validate_left(Relation rel, BlockNumber *blkno, BlockNumber lastcurrblkno)
static void _bt_savepostingitem(BTScanOpaque so, int itemIndex, OffsetNumber offnum, ItemPointer heapTid, int tupleOffset)
BTStack _bt_search(Relation rel, Relation heaprel, BTScanInsert key, Buffer *bufP, int access)
OffsetNumber _bt_binsrch_insert(Relation rel, BTInsertState insertstate)
bool _bt_next(IndexScanDesc scan, ScanDirection dir)
static void _bt_returnitem(IndexScanDesc scan, BTScanOpaque so)
int32 _bt_compare(Relation rel, BTScanInsert key, Page page, OffsetNumber offnum)
bool _bt_scanbehind_checkkeys(IndexScanDesc scan, ScanDirection dir, IndexTuple finaltup)
bool _bt_checkkeys(IndexScanDesc scan, BTReadPageState *pstate, bool arrayKeys, IndexTuple tuple, int tupnatts)
void _bt_freestack(BTStack stack)
void _bt_killitems(IndexScanDesc scan)
bool _bt_check_natts(Relation rel, bool heapkeyspace, Page page, OffsetNumber offnum)
void _bt_set_startikey(IndexScanDesc scan, BTReadPageState *pstate)
void _bt_start_array_keys(IndexScanDesc scan, ScanDirection dir)
#define InvalidOffsetNumber
#define OffsetNumberIsValid(offsetNumber)
#define OffsetNumberNext(offsetNumber)
#define OffsetNumberPrev(offsetNumber)
#define pgstat_count_index_scan(rel)
static Pointer DatumGetPointer(Datum X)
static int32 DatumGetInt32(Datum X)
void PredicateLockPage(Relation relation, BlockNumber blkno, Snapshot snapshot)
void PredicateLockRelation(Relation relation, Snapshot snapshot)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
#define IndexRelationGetNumberOfAttributes(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
void ScanKeyEntryInitialize(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, RegProcedure procedure, Datum argument)
void ScanKeyEntryInitializeWithInfo(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, FmgrInfo *finfo, Datum argument)
#define ScanDirectionIsForward(direction)
#define ScanDirectionIsBackward(direction)
#define IsMVCCSnapshot(snapshot)
#define BTGreaterStrategyNumber
#define BTLessStrategyNumber
#define BTEqualStrategyNumber
#define BTLessEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
BTArrayKeyInfo * arrayKeys
BTScanPosItem items[MaxTIDsPerBTreePage]
LocationIndex tupleOffset
struct BTStackData * bts_parent
struct ParallelIndexScanDescData * parallel_scan
bool ignore_killed_tuples
struct IndexScanInstrumentation * instrument
ItemPointerData xs_heaptid
struct SnapshotData * xs_snapshot
StrategyNumber sk_strategy
#define IsolationIsSerializable()