148 stack_in, page_access);
189 stack_in = new_stack;
258 Assert(!forupdate || heaprel != NULL);
277 cmpval =
key->nextkey ? 0 : 1;
322 elog(
ERROR,
"fell off the end of index \"%s\"",
394 cmpval =
key->nextkey ? 0 : 1;
404 if (result >= cmpval)
506 low = insertstate->
low;
544 if (result >= cmpval)
569 (
errcode(ERRCODE_INDEX_CORRUPTED),
570 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\"",
591 insertstate->
low = low;
649 mid = low + ((high - low) / 2);
733 ncmpkey =
Min(ntupatts,
key->keysz);
736 scankey =
key->scankeys;
737 for (
int i = 1;
i <= ncmpkey;
i++)
795 if (
key->keysz > ntupatts)
804 if (
key->scantid == NULL)
829 if (!
key->backward &&
key->keysz == ntupatts && heapTid == NULL &&
1059 for (
int i = 0;;
cur++,
i++)
1067 Assert(impliesNN == NULL ||
1084 int ikey = bkey - so->
keyData;
1085 ScanKey skipequalitykey = bkey;
1088 for (
int arridx = 0; arridx < so->
numArrayKeys; arridx++)
1110 impliesNN = skipequalitykey;
1112 Assert(bkey == NULL && impliesNN == NULL);
1119 if (bkey == NULL && impliesNN != NULL &&
1145 startKeys[keysz++] = bkey;
1200 curattr =
cur->sk_attno;
1219 switch (
cur->sk_strategy)
1225 else if (impliesNN == NULL)
1235 else if (impliesNN == NULL)
1260 for (
int i = 0;
i < keysz;
i++)
1272 bool loosen_strat =
false,
1273 tighten_strat =
false;
1299 memcpy(inskey.scankeys +
i, subkey,
sizeof(
ScanKeyData));
1334 tighten_strat =
true;
1341 loosen_strat =
true;
1349 memcpy(inskey.scankeys + keysz, subkey,
sizeof(
ScanKeyData));
1355 Assert(!(loosen_strat && tighten_strat));
1359 switch (strat_total)
1372 switch (strat_total)
1426 elog(
ERROR,
"missing support function %d(%u,%u) for attribute %d of index \"%s\"",
1448 inskey.anynullkeys =
false;
1449 inskey.scantid = NULL;
1450 inskey.keysz = keysz;
1451 switch (strat_total)
1455 inskey.nextkey =
false;
1456 inskey.backward =
true;
1461 inskey.nextkey =
true;
1462 inskey.backward =
true;
1476 inskey.nextkey =
true;
1477 inskey.backward =
true;
1484 inskey.nextkey =
false;
1485 inskey.backward =
false;
1494 inskey.nextkey =
false;
1495 inskey.backward =
false;
1503 inskey.nextkey =
true;
1504 inskey.backward =
false;
1509 elog(
ERROR,
"unrecognized strat_total: %d", (
int) strat_total);
1698 pstate.minoff = minoff;
1699 pstate.maxoff = maxoff;
1700 pstate.finaltup = NULL;
1702 pstate.firstpage = firstpage;
1703 pstate.forcenonrequired =
false;
1704 pstate.startikey = 0;
1707 pstate.continuescan =
true;
1708 pstate.rechecks = 0;
1709 pstate.targetdistance = 0;
1710 pstate.nskipadvances = 0;
1743 if (!pstate.firstpage && minoff < maxoff)
1749 offnum =
Max(offnum, minoff);
1751 while (offnum <= maxoff)
1770 pstate.offnum = offnum;
1780 Assert(!passes_quals && pstate.continuescan);
1781 Assert(offnum < pstate.skip);
1782 Assert(!pstate.forcenonrequired);
1784 offnum = pstate.skip;
1822 if (!pstate.continuescan)
1846 if (pstate.forcenonrequired)
1848 pstate.forcenonrequired =
false;
1849 pstate.startikey = 0;
1855 if (!pstate.continuescan)
1894 if (!pstate.firstpage && minoff < maxoff)
1900 offnum =
Min(offnum, maxoff);
1902 while (offnum >= minoff)
1921 if (offnum > minoff)
1927 tuple_alive =
false;
1935 pstate.offnum = offnum;
1936 if (arrayKeys && offnum == minoff && pstate.forcenonrequired)
1939 pstate.forcenonrequired =
false;
1940 pstate.startikey = 0;
1955 Assert(!passes_quals && pstate.continuescan);
1956 Assert(!pstate.forcenonrequired);
1967 Assert(!passes_quals && pstate.continuescan);
1968 Assert(offnum > pstate.skip);
1969 Assert(!pstate.forcenonrequired);
1971 offnum = pstate.skip;
1976 if (passes_quals && tuple_alive)
2015 if (!pstate.continuescan)
2025 if (!pstate.continuescan)
2046 Assert(!pstate.forcenonrequired);
2101 memcpy(base, itup, itupsz);
2103 base->
t_info &= ~INDEX_SIZE_MASK;
2428 lastcurrblkno = blkno;
2560 elog(
ERROR,
"fell off the end of index \"%s\"",
2578 elog(
ERROR,
"could not find left sibling of block %u in index \"%s\"",
2650 elog(
ERROR,
"fell off the end of index \"%s\"",
2662 (
errcode(ERRCODE_INDEX_CORRUPTED),
2742 elog(
ERROR,
"invalid scan direction: %d", (
int) dir);
#define InvalidBlockNumber
void IncrBufferRefCount(Buffer buffer)
BlockNumber BufferGetBlockNumber(Buffer buffer)
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
static void * 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(const ItemPointerData *arg1, const ItemPointerData *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 bool _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, BlockNumber lastcurrblkno, ScanDirection dir, bool seized)
static int _bt_setuppostingitems(BTScanOpaque so, int itemIndex, OffsetNumber offnum, const ItemPointerData *heapTid, IndexTuple itup)
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)
static void _bt_drop_lock_and_maybe_pin(Relation rel, BTScanOpaque so)
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 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()