fix error in judging overflow of unsigned integer multiplication

This commit is contained in:
obdev
2023-07-11 19:23:56 +00:00
committed by ob-robot
parent ddb3abbab6
commit 7e1fc2053a
2 changed files with 6 additions and 17 deletions

View File

@ -479,7 +479,8 @@ struct ObIntIntBatchMulRaw : public ObArithOpRawType<int64_t, int64_t, int64_t>
static int raw_check(const int64_t, const int64_t l, const int64_t r) static int raw_check(const int64_t, const int64_t l, const int64_t r)
{ {
int ret = OB_SUCCESS; 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]; char expr_str[OB_MAX_TWO_OPERATOR_EXPR_LENGTH];
ret = OB_OPERATE_OVERFLOW; ret = OB_OPERATE_OVERFLOW;
int64_t pos = 0; int64_t pos = 0;

View File

@ -150,22 +150,10 @@ public:
} }
OB_INLINE static bool is_uint_uint_mul_out_of_range(uint64_t val1, uint64_t val2) OB_INLINE static bool is_uint_uint_mul_out_of_range(uint64_t val1, uint64_t val2)
{ {
int ret = false; int overflow = false;
uint64_t tmp = val1; unsigned long long res;
if (val1 > val2) { overflow = __builtin_umulll_overflow(val1, val2, &res);
tmp = val1; return overflow;
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;
} }
private: private:
static ObArithFunc mul_funcs_[common::ObMaxTC]; static ObArithFunc mul_funcs_[common::ObMaxTC];