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