diff --git a/src/gausskernel/storage/access/nbtree/nbtsearch.cpp b/src/gausskernel/storage/access/nbtree/nbtsearch.cpp index 3576785aa..1d59776cf 100644 --- a/src/gausskernel/storage/access/nbtree/nbtsearch.cpp +++ b/src/gausskernel/storage/access/nbtree/nbtsearch.cpp @@ -442,6 +442,7 @@ int32 _bt_compare(Relation rel, BTScanInsert key, Page page, OffsetNumber offnum * Check tuple has correct number of attributes. */ _bt_check_natts_correct(rel, key->heapkeyspace, page, offnum); + /* * Force result ">" if target item is first data item on an internal page * --- see NOTE above. @@ -474,51 +475,30 @@ int32 _bt_compare(Relation rel, BTScanInsert key, Page page, OffsetNumber offnum datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); if (likely((!(scankey->sk_flags & SK_ISNULL)) && !isNull)) { - if (scankey->sk_flags & SK_BT_DESC) { - /* btint4cmp */ - if (scankey->sk_func.fn_oid == F_BTINT4CMP) { - result = (int32)datum == (int32)scankey->sk_argument - ? 0 - : ((int32)datum > (int32)scankey->sk_argument ? 1 : -1); - } else if (scankey->sk_func.fn_oid == F_BTINT8CMP) { - result = (int64)datum == (int64)scankey->sk_argument - ? 0 - : ((int64)datum > (int64)scankey->sk_argument ? 1 : -1); - } else if (scankey->sk_func.fn_oid == F_BTINT84CMP) { - result = (int64)datum == (int64)(int32)scankey->sk_argument - ? 0 - : ((int64)datum > (int64)(int32)scankey->sk_argument ? 1 : -1); - } else if (scankey->sk_func.fn_oid == F_BTINT48CMP) { - result = (int64)(int32)datum == (int64)scankey->sk_argument - ? 0 - : ((int64)(int32)datum > (int64)scankey->sk_argument ? 1 : -1); - } else { - result = DatumGetInt32( - FunctionCall2Coll(&scankey->sk_func, scankey->sk_collation, datum, scankey->sk_argument)); - } + int8 multiplier = (scankey->sk_flags & SK_BT_DESC) ? 1 : -1; + /* btint4cmp */ + if (scankey->sk_func.fn_oid == F_BTINT4CMP) { + result = (int32)datum == (int32)scankey->sk_argument + ? 0 + : ((int32)datum > (int32)scankey->sk_argument ? 1 : -1); + } else if (scankey->sk_func.fn_oid == F_BTINT8CMP) { + result = (int64)datum == (int64)scankey->sk_argument + ? 0 + : ((int64)datum > (int64)scankey->sk_argument ? 1 : -1); + } else if (scankey->sk_func.fn_oid == F_BTINT84CMP) { + result = (int64)datum == (int64)(int32)scankey->sk_argument + ? 0 + : ((int64)datum > (int64)(int32)scankey->sk_argument ? 1 : -1); + } else if (scankey->sk_func.fn_oid == F_BTINT48CMP) { + result = (int64)(int32)datum == (int64)scankey->sk_argument + ? 0 + : ((int64)(int32)datum > (int64)scankey->sk_argument ? 1 : -1); } else { - /* btint4cmp */ - if (scankey->sk_func.fn_oid == F_BTINT4CMP) { - result = (int32)datum == (int32)scankey->sk_argument - ? 0 - : ((int32)datum > (int32)scankey->sk_argument ? -1 : 1); - } else if (scankey->sk_func.fn_oid == F_BTINT8CMP) { - result = (int64)datum == (int64)scankey->sk_argument - ? 0 - : ((int64)datum > (int64)scankey->sk_argument ? -1 : 1); - } else if (scankey->sk_func.fn_oid == F_BTINT84CMP) { - result = (int64)datum == (int64)(int32)scankey->sk_argument - ? 0 - : ((int64)datum > (int64)(int32)scankey->sk_argument ? -1 : 1); - } else if (scankey->sk_func.fn_oid == F_BTINT48CMP) { - result = (int64)(int32)datum == (int64)scankey->sk_argument - ? 0 - : ((int64)(int32)datum > (int64)scankey->sk_argument ? -1 : 1); - } else { - result = -(DatumGetInt32( - FunctionCall2Coll(&scankey->sk_func, scankey->sk_collation, datum, scankey->sk_argument))); - } + result = DatumGetInt32( + FunctionCall2Coll(&scankey->sk_func, scankey->sk_collation, datum, scankey->sk_argument)); } + + result *= multiplier; } else { if (scankey->sk_flags & SK_ISNULL) { /* key is NULL */ if (isNull)