From 3b53c2c7f1e535de7d15ef3846feb5f7d264e0a3 Mon Sep 17 00:00:00 2001 From: Assaf Bern Date: Wed, 24 Aug 2022 19:23:58 +0300 Subject: [PATCH] Avoid casting REAL into DOUBLE on is_nan() --- .../java/io/trino/operator/scalar/MathFunctions.java | 9 +++++++++ .../java/io/trino/operator/scalar/TestMathFunctions.java | 1 + 2 files changed, 10 insertions(+) diff --git a/core/trino-main/src/main/java/io/trino/operator/scalar/MathFunctions.java b/core/trino-main/src/main/java/io/trino/operator/scalar/MathFunctions.java index 5df1d49ae2ec..c5009f121f4a 100644 --- a/core/trino-main/src/main/java/io/trino/operator/scalar/MathFunctions.java +++ b/core/trino-main/src/main/java/io/trino/operator/scalar/MathFunctions.java @@ -1176,6 +1176,15 @@ public static boolean isNaN(@SqlType(StandardTypes.DOUBLE) double num) return Double.isNaN(num); } + @Description("Test if value is not-a-number") + @ScalarFunction("is_nan") + @SqlType(StandardTypes.BOOLEAN) + public static boolean isNaNReal(@SqlType(StandardTypes.REAL) long value) + { + float floatValue = intBitsToFloat(toIntExact(value)); + return Float.isNaN(floatValue); + } + @Description("Test if value is finite") @ScalarFunction @SqlType(StandardTypes.BOOLEAN) diff --git a/core/trino-main/src/test/java/io/trino/operator/scalar/TestMathFunctions.java b/core/trino-main/src/test/java/io/trino/operator/scalar/TestMathFunctions.java index 1dd8d5316fec..4df7da04557f 100644 --- a/core/trino-main/src/test/java/io/trino/operator/scalar/TestMathFunctions.java +++ b/core/trino-main/src/test/java/io/trino/operator/scalar/TestMathFunctions.java @@ -616,6 +616,7 @@ public void testIsNaN() assertFunction("is_nan(0.0E0 / 1.0E0)", BOOLEAN, false); assertFunction("is_nan(infinity() / infinity())", BOOLEAN, true); assertFunction("is_nan(nan())", BOOLEAN, true); + assertFunction("is_nan(REAL 'NaN')", BOOLEAN, true); assertFunction("is_nan(REAL '0.0' / REAL '0.0')", BOOLEAN, true); assertFunction("is_nan(REAL '0.0' / 1.0E0)", BOOLEAN, false); assertFunction("is_nan(infinity() / infinity())", BOOLEAN, true);