@@ -25,8 +25,13 @@ bool GeneralCompare<Store_Row, has_addon>::operator()(const Store_Row *l, const
2525 bool less = false ;
2626 int &ret = ret_;
2727 if (OB_UNLIKELY (OB_SUCCESS != ret)) {
28+ // Use pointer comparison as a consistent fallback to maintain strict weak ordering.
29+ // Returning false for all pairs would cause introsort's right-scan loop
30+ // (while !comp(pivot, *i)) to advance past array bounds, triggering abort().
31+ less = l < r;
2832 } else if (OB_FAIL (fast_check_status ())) {
2933 SQL_ENG_LOG (WARN , " fast check failed" , K (ret));
34+ less = l < r;
3035 } else {
3136 if (CompareBase::ENABLE == encode_sk_state_) {
3237 ObLength l_len = 0 ;
@@ -260,8 +265,10 @@ bool SingleColCompare<Store_Row, is_basic_cmp, is_topn_sort>::operator()(const S
260265 bool less = false ;
261266 int &ret = ret_;
262267 if (OB_UNLIKELY (OB_SUCCESS != ret)) {
268+ less = l < r;
263269 } else if (OB_FAIL (fast_check_status ())) {
264270 SQL_ENG_LOG (WARN , " fast check failed" , K (ret));
271+ less = l < r;
265272 } else {
266273 __builtin_prefetch (l, 0 /* read */ , 2 /* high temp locality*/ );
267274 __builtin_prefetch (r, 0 /* read */ , 2 /* high temp locality*/ );
@@ -492,8 +499,10 @@ bool FixedCompare<Store_Row, has_addon>::operator()(const Store_Row *l, const St
492499 bool less = false ;
493500 int &ret = ret_;
494501 if (OB_UNLIKELY (OB_SUCCESS != ret)) {
502+ less = l < r;
495503 } else if (OB_FAIL (fast_check_status ())) {
496504 SQL_ENG_LOG (WARN , " fast check failed" , K (ret));
505+ less = l < r;
497506 } else {
498507 __builtin_prefetch (l, 0 /* read */ , 2 /* high temp locality*/ );
499508 __builtin_prefetch (r, 0 /* read */ , 2 /* high temp locality*/ );
0 commit comments