raminqaf commented on code in PR #28758:
URL: https://github.com/apache/flink/pull/28758#discussion_r3690102532


##########
flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRulesTest.java:
##########
@@ -1544,35 +1544,55 @@ Stream<CastTestSpecBuilder> testCases() {
                         .fromCase(BITMAP(), DEFAULT_BITMAP, 
DEFAULT_BITMAP.toBytes())
                         .fromCase(BITMAP(), Bitmap.empty(), 
Bitmap.empty().toBytes())
                         .fromCase(BITMAP(), null, null),
-                // From VARIANT to primitive types. Numeric targets are 
lenient: a variant holding
-                // any numeric kind converts to the requested numeric type 
(widening and narrowing).
-                // Non-numeric targets are strict: the stored kind must match, 
otherwise the cast
-                // fails and TRY_CAST returns null.
+                // From VARIANT to primitive types. A cast succeeds only when 
the target holds the
+                // stored value unaltered: an integer widens or narrows while 
it stays in range, a
+                // DECIMAL has to fit the precision and scale, and a timestamp 
the precision. FLOAT
+                // and DOUBLE are approximate, so they take any numeric kind 
and reject only a
+                // magnitude out of range. Reading one kind as another is 
never implicit.
                 CastTestSpecBuilder.testCastTo(BOOLEAN())
                         .fromCase(VARIANT(), Variant.newBuilder().of(true), 
true)
                         .fromCase(VARIANT(), Variant.newBuilder().of(false), 
false)
                         .fail(VARIANT(), Variant.newBuilder().of(1), 
TableRuntimeException.class),
                 CastTestSpecBuilder.testCastTo(TINYINT())
                         .fromCase(VARIANT(), Variant.newBuilder().of((byte) 
42), (byte) 42)
+                        // a wider integer kind narrows while the value is in 
range
                         .fromCase(VARIANT(), Variant.newBuilder().of(42), 
(byte) 42)
+                        // out of range is rejected instead of wrapping
+                        .fail(VARIANT(), Variant.newBuilder().of(1000), 
TableRuntimeException.class)
                         .fail(VARIANT(), Variant.newBuilder().of("x"), 
TableRuntimeException.class),
                 CastTestSpecBuilder.testCastTo(SMALLINT())
                         .fromCase(VARIANT(), Variant.newBuilder().of((short) 
42), (short) 42)
                         .fromCase(VARIANT(), Variant.newBuilder().of((byte) 
42), (short) 42)
+                        .fromCase(VARIANT(), Variant.newBuilder().of(1000), 
(short) 1000)
+                        .fail(
+                                VARIANT(),
+                                Variant.newBuilder().of(40000),
+                                TableRuntimeException.class)
                         .fail(
                                 VARIANT(),
                                 Variant.newBuilder().of(true),
                                 TableRuntimeException.class),
                 CastTestSpecBuilder.testCastTo(INT())
-                        // widening: a JSON integer is stored in the smallest 
type but still casts
-                        // up
+                        .fromCase(VARIANT(), Variant.newBuilder().of(42), 42)
+                        // every integer kind converts as long as the value 
fits
                         .fromCase(VARIANT(), Variant.newBuilder().of((byte) 
42), 42)
                         .fromCase(VARIANT(), Variant.newBuilder().of((short) 
42), 42)
-                        .fromCase(VARIANT(), Variant.newBuilder().of(42), 42)
                         .fromCase(VARIANT(), Variant.newBuilder().of(42L), 42)
-                        // narrowing from a floating point or decimal value 
truncates
-                        .fromCase(VARIANT(), Variant.newBuilder().of(3.9d), 3)
-                        .fromCase(VARIANT(), Variant.newBuilder().of(new 
BigDecimal("7.2")), 7)
+                        .fail(
+                                VARIANT(),
+                                Variant.newBuilder().of(2147483648L),
+                                TableRuntimeException.class)
+                        // an approximate or decimal kind is not read as an 
integer, whether or not
+                        // the value happens to be integral
+                        .fail(VARIANT(), Variant.newBuilder().of(7.0d), 
TableRuntimeException.class)
+                        .fail(
+                                VARIANT(),
+                                Variant.newBuilder().of(new BigDecimal("7.0")),
+                                TableRuntimeException.class)

Review Comment:
   Now casts with trailing zeros to integer types are allowed



-- 
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