diff --git a/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h b/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h index a08bebe55f..0dc432e758 100644 --- a/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h +++ b/deps/oblib/src/lib/wide_integer/ob_wide_integer_impl.h @@ -597,21 +597,24 @@ struct ObWideInteger::_impl bool overflow = false; for (unsigned j = 0; j < inner_limit; j++) { for (unsigned i = 0; i < outter_limit; i++) { - carrier += res.items_[i + j] + static_cast(lval.items_[i]) * - static_cast(rval.items_[j]); if (i + j < ITEM_COUNT) { + carrier += res.items_[i + j] + static_cast(lval.items_[i]) * + static_cast(rval.items_[j]); res.items_[i+j] = static_cast(carrier); carrier >>= 64; } else { overflow = true; break; } - } - if (carrier) { + } // end inner while + if (OB_UNLIKELY(overflow)) { + break; + } else if (carrier) { if (j + outter_limit < ITEM_COUNT) { res.items_[j + outter_limit] = static_cast(carrier); } else { overflow = true; + break; } carrier = 0; }