From 87dc71f794b89ec8c59f6981e3871a4bc4411c32 Mon Sep 17 00:00:00 2001 From: Bert Vermeiren Date: Thu, 23 Apr 2026 12:10:10 +0200 Subject: [PATCH] Fix: allow coercion from Binary and LargeBinary into BinaryView --- datafusion/expr/src/type_coercion/functions.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/datafusion/expr/src/type_coercion/functions.rs b/datafusion/expr/src/type_coercion/functions.rs index 654e790667ead..7b6cb7b35d234 100644 --- a/datafusion/expr/src/type_coercion/functions.rs +++ b/datafusion/expr/src/type_coercion/functions.rs @@ -888,6 +888,8 @@ fn coerced_from<'a>( (Utf8View, Utf8 | LargeUtf8 | Null) => Some(type_into.clone()), // Any type can be coerced into strings (Utf8 | LargeUtf8, _) => Some(type_into.clone()), + // We can go into a BinaryView from a Binary or LargeBinary + (BinaryView, Binary | LargeBinary | Null) => Some(type_into.clone()), (Null, _) if can_cast_types(type_from, type_into) => Some(type_into.clone()), (List(_), FixedSizeList(_, _)) => Some(type_into.clone()), @@ -956,6 +958,20 @@ mod tests { let cases = vec![ (DataType::Utf8View, DataType::Utf8), (DataType::Utf8View, DataType::LargeUtf8), + (DataType::Utf8View, DataType::Null), + ]; + + for case in cases { + assert_eq!(coerced_from(&case.0, &case.1), Some(case.0)); + } + } + + #[test] + fn test_binary_conversion() { + let cases = vec![ + (DataType::BinaryView, DataType::Binary), + (DataType::BinaryView, DataType::LargeBinary), + (DataType::BinaryView, DataType::Null), ]; for case in cases {