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