asolimando commented on code in PR #4557:
URL: https://github.com/apache/calcite/pull/4557#discussion_r2381606193


##########
core/src/test/java/org/apache/calcite/rex/RexLosslessCastTest.java:
##########
@@ -132,22 +137,305 @@ class RexLosslessCastTest extends RexProgramTestBase {
                 varcharType, rexBuilder.makeInputRef(intType, 0))), is(true));
   }
 
+  @Test void testLosslessCastIntegerToApproximate() {
+    final RelDataType tinyIntType = 
typeFactory.createSqlType(SqlTypeName.TINYINT);
+    final RelDataType smallIntType = 
typeFactory.createSqlType(SqlTypeName.SMALLINT);
+    final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
+    final RelDataType bigIntType = 
typeFactory.createSqlType(SqlTypeName.BIGINT);
+    final RelDataType doubleType = 
typeFactory.createSqlType(SqlTypeName.DOUBLE);
+    final RelDataType realType = typeFactory.createSqlType(SqlTypeName.REAL);
+
+    // Positive: tiny/small/int -> double
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(doubleType,
+        rexBuilder.makeInputRef(tinyIntType, 0))), is(true));
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(doubleType,
+        rexBuilder.makeInputRef(smallIntType, 0))), is(true));
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(doubleType,
+        rexBuilder.makeInputRef(intType, 0))), is(true));
+
+    // Negative: bigint -> double is not guaranteed to be exact
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(doubleType,
+        rexBuilder.makeInputRef(bigIntType, 0))), is(false));
+
+    // Positive: tiny/small -> real
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(realType,
+        rexBuilder.makeInputRef(tinyIntType, 0))), is(true));
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(realType,
+        rexBuilder.makeInputRef(smallIntType, 0))), is(true));
+
+    // Negative: int/bigint -> real not guaranteed exact
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(realType,
+        rexBuilder.makeInputRef(intType, 0))), is(false));
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(realType,
+        rexBuilder.makeInputRef(bigIntType, 0))), is(false));
+  }
+
+  @Test void testLosslessCastIntegerToDecimal() {
+    final RelDataType tinyIntType = 
typeFactory.createSqlType(SqlTypeName.TINYINT);
+    final RelDataType smallIntType = 
typeFactory.createSqlType(SqlTypeName.SMALLINT);
+    final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
+    final RelDataType bigIntType = 
typeFactory.createSqlType(SqlTypeName.BIGINT);
+
+    final RelDataType decPrec3Scale0  = 
typeFactory.createSqlType(SqlTypeName.DECIMAL, 3, 0);

Review Comment:
   I consistently renamed all those fields as `dec_p_s`



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to