fix error in judging overflow of unsigned integer multiplication
This commit is contained in:
@ -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)
|
||||
{
|
||||
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;
|
||||
|
||||
@ -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];
|
||||
|
||||
Reference in New Issue
Block a user