138 stack_in, page_access);
179 stack_in = new_stack;
248 Assert(!forupdate || heaprel != NULL);
267 cmpval =
key->nextkey ? 0 : 1;
312 elog(
ERROR,
"fell off the end of index \"%s\"",
384 cmpval =
key->nextkey ? 0 : 1;
394 if (result >= cmpval)
496 low = insertstate->
low;
534 if (result >= cmpval)
559 (
errcode(ERRCODE_INDEX_CORRUPTED),
560 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\"",
581 insertstate->
low = low;
639 mid = low + ((high - low) / 2);
723 ncmpkey =
Min(ntupatts,
key->keysz);
726 scankey =
key->scankeys;
727 for (
int i = 1;
i <= ncmpkey;
i++)
785 if (
key->keysz > ntupatts)
794 if (
key->scantid == NULL)
819 if (!
key->backward &&
key->keysz == ntupatts && heapTid == NULL &&
1049 for (
int i = 0;;
cur++,
i++)
1057 Assert(impliesNN == NULL ||
1074 int ikey = bkey - so->
keyData;
1075 ScanKey skipequalitykey = bkey;
1078 for (
int arridx = 0; arridx < so->
numArrayKeys; arridx++)
1100 impliesNN = skipequalitykey;
1102 Assert(bkey == NULL && impliesNN == NULL);
1109 if (bkey == NULL && impliesNN != NULL &&
1135 startKeys[keysz++] = bkey;
1190 curattr =
cur->sk_attno;
1209 switch (
cur->sk_strategy)
1215 else if (impliesNN == NULL)
1225 else if (impliesNN == NULL)
1250 for (
int i = 0;
i < keysz;
i++)
1262 bool loosen_strat =
false,
1263 tighten_strat =
false;
1289 memcpy(inskey.scankeys +
i, subkey,
sizeof(
ScanKeyData));
1324 tighten_strat =
true;
1331 loosen_strat =
true;
1339 memcpy(inskey.scankeys + keysz, subkey,
sizeof(
ScanKeyData));
1345 Assert(!(loosen_strat && tighten_strat));
1349 switch (strat_total)
1362 switch (strat_total)
1416 elog(
ERROR,
"missing support function %d(%u,%u) for attribute %d of index \"%s\"",
1438 inskey.anynullkeys =
false;
1439 inskey.scantid = NULL;
1440 inskey.keysz = keysz;
1441 switch (strat_total)
1445 inskey.nextkey =
false;
1446 inskey.backward =
true;
1451 inskey.nextkey =
true;
1452 inskey.backward =
true;
1466 inskey.nextkey =
true;
1467 inskey.backward =
true;
1474 inskey.nextkey =
false;
1475 inskey.backward =
false;
1484 inskey.nextkey =
false;
1485 inskey.backward =
false;
1493 inskey.nextkey =
true;
1494 inskey.backward =
false;
1499 elog(
ERROR,
"unrecognized strat_total: %d", (
int) strat_total);
1907 lastcurrblkno = blkno;
2039 elog(
ERROR,
"fell off the end of index \"%s\"",
2057 elog(
ERROR,
"could not find left sibling of block %u in index \"%s\"",
2129 elog(
ERROR,
"fell off the end of index \"%s\"",
2141 (
errcode(ERRCODE_INDEX_CORRUPTED),
2221 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,...)
#define palloc_object(type)
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)
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)
bool _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum, bool firstpage)
void _bt_start_array_keys(IndexScanDesc scan, ScanDirection dir)
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 BTScanPosIsValid(scanpos)
#define P_FIRSTDATAKEY(opaque)
#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 bool _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, BlockNumber lastcurrblkno, ScanDirection dir, bool seized)
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)
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)
void _bt_freestack(BTStack stack)
void _bt_killitems(IndexScanDesc scan)
bool _bt_check_natts(Relation rel, bool heapkeyspace, Page page, OffsetNumber offnum)
#define InvalidOffsetNumber
#define OffsetNumberPrev(offsetNumber)
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define pgstat_count_index_scan(rel)
static Pointer DatumGetPointer(Datum X)
static int32 DatumGetInt32(Datum X)
void PredicateLockRelation(Relation relation, Snapshot snapshot)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(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
struct IndexScanInstrumentation * instrument
ItemPointerData xs_heaptid
struct SnapshotData * xs_snapshot
StrategyNumber sk_strategy
#define IsolationIsSerializable()