|
5 | 5 |
|
6 | 6 | package org.opensearch.sql.expression.function.udf.math; |
7 | 7 |
|
| 8 | +import java.math.BigDecimal; |
| 9 | +import java.math.RoundingMode; |
8 | 10 | import java.util.List; |
9 | 11 | import org.apache.calcite.adapter.enumerable.NotNullImplementor; |
10 | 12 | import org.apache.calcite.adapter.enumerable.NullPolicy; |
|
24 | 26 | * PPL. Therefore, we implement our versions |
25 | 27 | */ |
26 | 28 | public class DivideFunction extends ImplementorUDF { |
| 29 | + public static final int MAX_SCALE = 38; |
27 | 30 |
|
28 | 31 | public DivideFunction() { |
29 | 32 | super(new DivideImplementor(), NullPolicy.ANY); |
@@ -54,6 +57,12 @@ public static Number divide(Number dividend, Number divisor) { |
54 | 57 | if (MathUtils.isIntegral(dividend) && MathUtils.isIntegral(divisor)) { |
55 | 58 | long result = dividend.longValue() / divisor.longValue(); |
56 | 59 | return MathUtils.coerceToWidestIntegralType(dividend, divisor, result); |
| 60 | + } else if (MathUtils.isDecimal(dividend) && MathUtils.isIntegral(divisor)) { |
| 61 | + return ((BigDecimal) dividend) |
| 62 | + .divide(BigDecimal.valueOf(divisor.longValue()), MAX_SCALE + 1, RoundingMode.HALF_UP); |
| 63 | + } else if (MathUtils.isIntegral(dividend) && MathUtils.isDecimal(divisor)) { |
| 64 | + return (BigDecimal.valueOf(dividend.longValue())) |
| 65 | + .divide((BigDecimal) divisor, MAX_SCALE + 1, RoundingMode.HALF_UP); |
57 | 66 | } |
58 | 67 | double result = dividend.doubleValue() / divisor.doubleValue(); |
59 | 68 | return MathUtils.coerceToWidestFloatingType(dividend, divisor, result); |
|
0 commit comments