diff --git a/be/src/exprs/decimalv2_operators.cpp b/be/src/exprs/decimalv2_operators.cpp index 32f54d95ed..ccc41b9a8a 100644 --- a/be/src/exprs/decimalv2_operators.cpp +++ b/be/src/exprs/decimalv2_operators.cpp @@ -176,12 +176,24 @@ DateTimeVal DecimalV2Operators::cast_to_date_val(FunctionContext* context, return result; \ } -#define DECIMAL_ARITHMETIC_OPS() \ - DECIMAL_ARITHMETIC_OP(add, +); \ - DECIMAL_ARITHMETIC_OP(subtract, -); \ - DECIMAL_ARITHMETIC_OP(multiply, *); \ - DECIMAL_ARITHMETIC_OP(divide, /); \ - DECIMAL_ARITHMETIC_OP(mod, %); +#define DECIMAL_ARITHMETIC_OP_DIVIDE(FN_NAME, OP) \ +DecimalV2Val DecimalV2Operators::FN_NAME##_decimalv2_val_decimalv2_val( \ + FunctionContext* context, const DecimalV2Val& v1, const DecimalV2Val& v2) { \ + if (v1.is_null || v2.is_null || v2.value() == 0) return DecimalV2Val::null(); \ + DecimalV2Value iv1 = DecimalV2Value::from_decimal_val(v1); \ + DecimalV2Value iv2 = DecimalV2Value::from_decimal_val(v2); \ + DecimalV2Value ir = iv1 OP iv2; \ + DecimalV2Val result; \ + ir.to_decimal_val(&result); \ + return result; \ +} + +#define DECIMAL_ARITHMETIC_OPS() \ + DECIMAL_ARITHMETIC_OP(add, +); \ + DECIMAL_ARITHMETIC_OP(subtract, -); \ + DECIMAL_ARITHMETIC_OP(multiply, *); \ + DECIMAL_ARITHMETIC_OP_DIVIDE(divide, /); \ + DECIMAL_ARITHMETIC_OP_DIVIDE(mod, %); DECIMAL_ARITHMETIC_OPS(); diff --git a/be/src/runtime/decimalv2_value.cpp b/be/src/runtime/decimalv2_value.cpp index 437dd8f52c..4a123985a8 100644 --- a/be/src/runtime/decimalv2_value.cpp +++ b/be/src/runtime/decimalv2_value.cpp @@ -192,7 +192,7 @@ DecimalV2Value operator/(const DecimalV2Value& v1, const DecimalV2Value& v2) { int128_t x = v1.value(); int128_t y = v2.value(); - //todo: return 0 for divide zero + DCHECK(y != 0); if (x == 0 || y == 0) return DecimalV2Value(0); bool is_positive = (x > 0 && y > 0) || (x < 0 && y < 0); do_div(abs(x), abs(y), &result); @@ -207,7 +207,7 @@ DecimalV2Value operator%(const DecimalV2Value& v1, const DecimalV2Value& v2) { int128_t x = v1.value(); int128_t y = v2.value(); - //todo: return 0 for divide zero + DCHECK(y != 0); if (x == 0 || y == 0) return DecimalV2Value(0); do_mod(x, y, &result);