From 8f55bcedaa9c109543627e9c785dab0ffb0e5c75 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Wed, 22 Jan 2020 20:59:57 -0800 Subject: [PATCH v2 3/3] Remove "negative infinity" check from _bt_compare(). --- src/backend/access/nbtree/nbtsearch.c | 32 ++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index dd56fdaaea..b2a2605c47 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -348,6 +348,8 @@ _bt_binsrch(Relation rel, high; int32 result, cmpval; + bool isleaf; + OffsetNumber noff; page = BufferGetPage(buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); @@ -359,6 +361,7 @@ _bt_binsrch(Relation rel, low = P_FIRSTDATAKEY(opaque); high = PageGetMaxOffsetNumber(page); + isleaf = P_ISLEAF(opaque); /* * If there are no keys on the page, return the first available slot. Note @@ -386,13 +389,20 @@ _bt_binsrch(Relation rel, cmpval = key->nextkey ? 0 : 1; /* select comparison value */ + if (isleaf) + noff = InvalidOffsetNumber; + else + noff = P_FIRSTDATAKEY(opaque); while (high > low) { OffsetNumber mid = low + ((high - low) / 2); /* We have low <= mid < high, so mid points at a real slot */ - result = _bt_compare_inl(rel, key, page, mid); + if (mid == noff) + result = 1; + else + result = _bt_compare_inl(rel, key, page, mid); if (result >= cmpval) low = mid + 1; @@ -407,7 +417,7 @@ _bt_binsrch(Relation rel, * On a leaf page, we always return the first key >= scan key (resp. > * scan key), which could be the last slot + 1. */ - if (P_ISLEAF(opaque)) + if (isleaf) return low; /* @@ -536,6 +546,16 @@ _bt_compare(Relation rel, Page page, OffsetNumber offnum) { + BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); + + /* + * Force result ">" if target item is first data item on an internal page + * --- see NOTE above. + */ + if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque)) + return 1; + + return _bt_compare_inl(rel, key, page, offnum); } @@ -568,7 +588,6 @@ _bt_compare_inl(Relation rel, OffsetNumber offnum) { TupleDesc itupdesc = RelationGetDescr(rel); - BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); IndexTuple itup; ItemPointer heapTid; int ski; @@ -580,13 +599,6 @@ _bt_compare_inl(Relation rel, Assert(key->keysz <= IndexRelationGetNumberOfKeyAttributes(rel)); Assert(key->heapkeyspace || key->scantid == NULL); - /* - * Force result ">" if target item is first data item on an internal page - * --- see NOTE above. - */ - if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque)) - return 1; - itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); ntupatts = BTreeTupleGetNAtts(itup, rel); -- 2.17.1