raminqaf commented on code in PR #29311:
URL: https://github.com/apache/flink/pull/29311#discussion_r4153459039
##########
flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/CastFunctionITCase.java:
##########
@@ -432,6 +435,272 @@ private static List<TestSetSpec> variantPrimitiveCasts() {
TINYINT()));
}
+ private static List<TestSetSpec> primitiveToVariantCasts() {
+ final VariantBuilder builder = Variant.newBuilder();
+ final LocalDateTime nanos =
LocalDateTime.parse("2026-09-25T10:15:30.123456789");
+ final Instant instant = Instant.parse("2026-09-25T10:15:30.123Z");
+ return List.of(
+ // A value keeps the kind of its SQL type, so an integer keeps
its width, and a
+ // string is wrapped rather than parsed.
+ CastTestSpecBuilder.testCastTo(VARIANT())
+ .fromCase(BOOLEAN(), true, builder.of(true))
+ .fromCase(INT(), 42, builder.of(42))
+ .fromCase(BIGINT(), 1L, builder.of(1L))
+ .fromCase(BIGINT(), 10000000000L,
builder.of(10000000000L))
+ .fromCase(DOUBLE(), 1.5d, builder.of(1.5d))
+ .fromCase(
+ DECIMAL(4, 2),
+ new BigDecimal("12.50"),
+ builder.of(new BigDecimal("12.50")))
+ .fromCase(STRING(), "{\"a\":1}",
builder.of("{\"a\":1}"))
+ .fromCase(
+ DATE(),
+ LocalDate.parse("2026-09-25"),
+ builder.of(LocalDate.parse("2026-09-25")))
+ .fromCase(TIMESTAMP(9), nanos, builder.of(nanos))
+ .fromCase(TIMESTAMP_LTZ(3), instant,
builder.of(instant))
+ .fromCase(UUID(), DEFAULT_UUID,
builder.of(DEFAULT_UUID))
+ .fromCase(INT(), null, null)
+ // a type without a VARIANT kind is rejected at
validation
+ .failValidation(INTERVAL(MONTH()), Period.ofMonths(2))
+ .build(),
+ TestSetSpec.forExpression("Cast a primitive to VARIANT and
back")
+ .onFieldsWithData(
+ 42L,
+ new BigDecimal("12.50"),
+ "hello",
+ LocalTime.of(10, 15, 30),
+ nanos,
+ instant,
+ DEFAULT_UUID,
+ new byte[] {1, 2, 3})
+ .andDataTypes(
+ BIGINT(),
+ DECIMAL(4, 2),
+ STRING(),
+ TIME(),
+ TIMESTAMP(9),
+ TIMESTAMP_LTZ(3),
+ UUID(),
+ BYTES())
+ .testResult(
+ $("f0").cast(VARIANT()).cast(BIGINT()),
+ "CAST(CAST(f0 AS VARIANT) AS BIGINT)",
+ 42L,
+ BIGINT())
+ .testResult(
+ $("f1").cast(VARIANT()).cast(DECIMAL(4, 2)),
+ "CAST(CAST(f1 AS VARIANT) AS DECIMAL(4, 2))",
+ new BigDecimal("12.50"),
+ DECIMAL(4, 2))
+ .testResult(
+ $("f2").cast(VARIANT()).cast(STRING()),
+ "CAST(CAST(f2 AS VARIANT) AS STRING)",
+ "hello",
+ STRING())
+ .testResult(
+ $("f3").cast(VARIANT()).cast(TIME()),
+ "CAST(CAST(f3 AS VARIANT) AS TIME)",
+ LocalTime.of(10, 15, 30),
+ TIME())
+ .testResult(
+ $("f4").cast(VARIANT()).cast(TIMESTAMP(9)),
+ "CAST(CAST(f4 AS VARIANT) AS TIMESTAMP(9))",
+ nanos,
+ TIMESTAMP(9))
+ .testResult(
+ $("f5").cast(VARIANT()).cast(TIMESTAMP_LTZ(3)),
+ "CAST(CAST(f5 AS VARIANT) AS
TIMESTAMP_LTZ(3))",
+ instant,
+ TIMESTAMP_LTZ(3))
+ .testResult(
+ $("f6").cast(VARIANT()).cast(UUID()),
+ "CAST(CAST(f6 AS VARIANT) AS UUID)",
+ DEFAULT_UUID,
+ UUID())
+ .testResult(
+ $("f7").cast(VARIANT()).cast(BYTES()),
+ "CAST(CAST(f7 AS VARIANT) AS BYTES)",
+ new byte[] {1, 2, 3},
+ BYTES()),
+ TestSetSpec.forExpression("Cast TIME to VARIANT and back")
+ .onFieldsWithData(
+ LocalTime.of(12, 34, 56, 123_000_000),
+ LocalTime.MIDNIGHT,
+ LocalTime.of(23, 59, 59, 999_000_000))
+ .andDataTypes(TIME(3), TIME(0), TIME(3))
+ .testResult(
+ $("f0").cast(VARIANT()).cast(TIME(3)),
+ "CAST(CAST(f0 AS VARIANT) AS TIME(3))",
+ LocalTime.of(12, 34, 56, 123_000_000),
+ TIME(3))
+ .testResult(
+ $("f1").cast(VARIANT()).cast(TIME(0)),
+ "CAST(CAST(f1 AS VARIANT) AS TIME(0))",
+ LocalTime.MIDNIGHT,
+ TIME(0))
+ .testResult(
+ $("f2").cast(VARIANT()).cast(TIME(3)),
+ "CAST(CAST(f2 AS VARIANT) AS TIME(3))",
+ LocalTime.of(23, 59, 59, 999_000_000),
+ TIME(3)),
+ // a VARIANT holds at most 16 MiB, so a longer string fails
CAST and TRY_CAST
+ // returns NULL
+ TestSetSpec.forExpression("Cast a string over the size limit
to VARIANT")
Review Comment:
Done. The spec is now a single SQL TRY_CAST row. VariantCastUtilsTest keeps
the boundary and the message.
--
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]