diff --git a/src/sql/engine/expr/ob_expr_mul.cpp b/src/sql/engine/expr/ob_expr_mul.cpp index 4e7c242107..456ca44ed8 100644 --- a/src/sql/engine/expr/ob_expr_mul.cpp +++ b/src/sql/engine/expr/ob_expr_mul.cpp @@ -479,7 +479,8 @@ struct ObIntIntBatchMulRaw : public ObArithOpRawType static int raw_check(const int64_t, const int64_t l, const int64_t r) { int ret = OB_SUCCESS; - if (OB_UNLIKELY(is_multi_overflow64(l, r))) { + long long res; + if (OB_UNLIKELY(ObExprMul::is_mul_out_of_range(l, r, res))) { char expr_str[OB_MAX_TWO_OPERATOR_EXPR_LENGTH]; ret = OB_OPERATE_OVERFLOW; int64_t pos = 0; diff --git a/src/sql/engine/expr/ob_expr_mul.h b/src/sql/engine/expr/ob_expr_mul.h index e89817c512..d7143ec535 100644 --- a/src/sql/engine/expr/ob_expr_mul.h +++ b/src/sql/engine/expr/ob_expr_mul.h @@ -150,22 +150,10 @@ public: } OB_INLINE static bool is_uint_uint_mul_out_of_range(uint64_t val1, uint64_t val2) { - int ret = false; - uint64_t tmp = val1; - if (val1 > val2) { - tmp = val1; - val1 = val2; - val2 = tmp; - } - if (val1 > UINT32_MAX) { - ret = true; - } else { - uint64_t c = val2 >> SHIFT_OFFSET; - uint64_t r = val1 * c; - if (r > UINT32_MAX) - ret = true; - } - return ret; + int overflow = false; + unsigned long long res; + overflow = __builtin_umulll_overflow(val1, val2, &res); + return overflow; } private: static ObArithFunc mul_funcs_[common::ObMaxTC];