This is an automated email from the ASF dual-hosted git repository.
dzamo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
The following commit(s) were added to refs/heads/master by this push:
new 58d8484 DRILL-8066: Convert non-finite floating point literals to
string RexLiterals (#2393)
58d8484 is described below
commit 58d848426d373c9aacfc499cdd65473705cfcee6
Author: James Turton <[email protected]>
AuthorDate: Mon Dec 6 09:41:37 2021 +0200
DRILL-8066: Convert non-finite floating point literals to string
RexLiterals (#2393)
---
.../exec/planner/logical/DrillConstExecutor.java | 14 ++++++++++
.../exec/fn/impl/TestMathFunctionsWithNanInf.java | 30 ++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java
index dd5b62e..2e1c854 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillConstExecutor.java
@@ -184,12 +184,26 @@ public class DrillConstExecutor implements RexExecutor {
case FLOAT4: {
float value = (materializedExpr.getMajorType().getMode() ==
TypeProtos.DataMode.OPTIONAL) ?
((NullableFloat4Holder) valueHolder).value : ((Float4Holder)
valueHolder).value;
+
+ // +Infinity, -Infinity and NaN must be represented as strings
since
+ // BigDecimal cannot represent them.
+ if (!Float.isFinite(value)) {
+ return rexBuilder.makeLiteral(Float.toString(value));
+ }
+
return rexBuilder.makeLiteral(new BigDecimal(value),
TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory,
SqlTypeName.FLOAT, newCall.getType().isNullable()), false);
}
case FLOAT8: {
double value = (materializedExpr.getMajorType().getMode() ==
TypeProtos.DataMode.OPTIONAL) ?
((NullableFloat8Holder) valueHolder).value : ((Float8Holder)
valueHolder).value;
+
+ // +Infinity, -Infinity and NaN must be represented as strings
since
+ // BigDecimal cannot represent them.
+ if (!Double.isFinite(value)) {
+ return rexBuilder.makeLiteral(Double.toString(value));
+ }
+
return rexBuilder.makeLiteral(new BigDecimal(value),
TypeInferenceUtils.createCalciteTypeWithNullability(typeFactory,
SqlTypeName.DOUBLE, newCall.getType().isNullable()), false);
}
diff --git
a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctionsWithNanInf.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctionsWithNanInf.java
index d2b6c3f..d6bb811 100644
---
a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctionsWithNanInf.java
+++
b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctionsWithNanInf.java
@@ -543,6 +543,36 @@ public class TestMathFunctionsWithNanInf extends
BaseTestQuery {
evalTest(table_name, json, query, columns, values);
}
+ @Test
+ public void testNanInfLiteralConversion() throws Exception {
+ String query =
+ "select " +
+ " cast('Infinity' as float) float_inf, " +
+ " cast('-Infinity' as float) float_ninf, " +
+ " cast('NaN' as float) float_nan, " +
+ " cast('Infinity' as double) double_inf, " +
+ " cast('-Infinity' as double) double_ninf, " +
+ " cast('NaN' as double) double_nan";
+
+ String[] columns = {
+ "float_inf", "float_ninf", "float_nan",
+ "double_inf", "double_ninf", "double_nan"
+ };
+
+ Object[] values = {
+ Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.NaN,
+ Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN
+ };
+
+ testBuilder()
+ .sqlQuery(query)
+ .ordered()
+ .baselineColumns(columns)
+ .baselineValues(values)
+ .build()
+ .run();
+ }
+
private void evalTest(String table_name, String json, String query,
String[] columns, Object[] values) throws Exception {
File file = new File(dirTestWatcher.getRootDir(), table_name);
try {