diff --git a/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java b/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java index d390d616ba20..3634734bfe14 100644 --- a/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java +++ b/processing/src/main/java/org/apache/druid/math/expr/ExprEval.java @@ -33,6 +33,7 @@ import org.apache.druid.segment.nested.StructuredData; import javax.annotation.Nullable; +import java.math.BigDecimal; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; @@ -388,7 +389,7 @@ public static ExprEval bestEffortOf(@Nullable Object val) return new StringExprEval((String) val); } if (val instanceof Number) { - if (val instanceof Float || val instanceof Double) { + if (val instanceof Float || val instanceof Double || val instanceof BigDecimal) { return new DoubleExprEval((Number) val); } return new LongExprEval((Number) val); diff --git a/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java b/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java index f03956022226..b18b8cff3ea1 100644 --- a/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java +++ b/processing/src/test/java/org/apache/druid/math/expr/EvalTest.java @@ -33,6 +33,7 @@ import org.junit.BeforeClass; import org.junit.Test; +import java.math.BigDecimal; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashMap; @@ -1380,6 +1381,9 @@ public void testBestEffortOf() assertBestEffortOf(1L, ExpressionType.LONG, 1L); assertBestEffortOf(1, ExpressionType.LONG, 1L); + // BigDecimal + assertBestEffortOf(new BigDecimal("0.034"), ExpressionType.DOUBLE, 0.034); + // by default, booleans are handled as longs assertBestEffortOf(true, ExpressionType.LONG, 1L); assertBestEffortOf(Arrays.asList(true, false), ExpressionType.LONG_ARRAY, new Object[]{1L, 0L});