This is an automated email from the ASF dual-hosted git repository.

mihaibudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 7cd4022a11 [CALCITE-7840] REAL literals should be represented with 
reduced precision
7cd4022a11 is described below

commit 7cd4022a1162448bfbca14e8da7e8451a5aac4a2
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Oct 5 17:51:50 2026 -0700

    [CALCITE-7840] REAL literals should be represented with reduced precision
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../java/org/apache/calcite/rel/rel2sql/SqlImplementor.java |  5 ++++-
 core/src/main/java/org/apache/calcite/rex/RexBuilder.java   |  9 +++++++++
 core/src/test/resources/sql/cast.iq                         | 13 +++++++++++++
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java 
b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index ca7f5efe4d..79663b0d6f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -1760,7 +1760,10 @@ public static SqlNode toSql(RexLiteral literal) {
               new SqlDataTypeSpec(new SqlBasicTypeNameSpec(typeName, POS), 
POS);
           return SqlStdOperatorTable.CAST.createCall(POS, strLiteral, 
typeSpec);
         }
-        return SqlLiteral.createApproxNumeric(d.toString(), POS);
+        final String digits = literal.getType().getSqlTypeName() == 
SqlTypeName.REAL
+            ? Float.toString(d.floatValue())
+            : d.toString();
+        return SqlLiteral.createApproxNumeric(digits, POS);
       } else {
         final BigDecimal bd = 
castNonNull(literal.getValueAs(BigDecimal.class));
         if (!SqlUtil.isBoundedDecimal(bd)) {
diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java 
b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
index 69d85b8a08..3ea6b63fc7 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -1558,6 +1558,15 @@ protected RexLiteral makeLiteral(
         }
       }
       break;
+    case DOUBLE:
+    case FLOAT:
+    case REAL:
+      if (o != null && type.getSqlTypeName() == SqlTypeName.REAL) {
+        // SQL REAL is the same as Java Float
+        // SQL FLOAT and DOUBLE ad the same as Java Double
+        o = (double) ((Number) o).floatValue();
+      }
+      break;
     default:
       break;
     }
diff --git a/core/src/test/resources/sql/cast.iq 
b/core/src/test/resources/sql/cast.iq
index 832c99e4d2..a02f89188a 100644
--- a/core/src/test/resources/sql/cast.iq
+++ b/core/src/test/resources/sql/cast.iq
@@ -2104,4 +2104,17 @@ FROM (VALUES (0)) AS t(zero);
 
 !ok
 
+# Test case for [CALCITE-7840] REAL literals should be represented with 
reduced precision
+values (cast(0.1e0 as real) = cast(0.1 as real),
+  cast(cast(0.1e0 as real) as double) = cast(cast(0.1 as real) as double),
+  cast(0.1e0 as real) = 0.1e0);
++--------+--------+--------+
+| EXPR$0 | EXPR$1 | EXPR$2 |
++--------+--------+--------+
+| true   | true   | false  |
++--------+--------+--------+
+(1 row)
+
+!ok
+
 # End cast.iq

Reply via email to