@@ -537,12 +537,12 @@ fn get_valid_types(
537537 element_types. push ( DataType :: Null ) ;
538538 nested_item_nullability. push ( None ) ;
539539 }
540- DataType :: List ( field) => {
540+ DataType :: List ( field) | DataType :: ListView ( field ) => {
541541 element_types. push ( field. data_type ( ) . clone ( ) ) ;
542542 nested_item_nullability. push ( Some ( field. is_nullable ( ) ) ) ;
543543 fixed_size = false ;
544544 }
545- DataType :: LargeList ( field) => {
545+ DataType :: LargeList ( field) | DataType :: LargeListView ( field ) => {
546546 element_types. push ( field. data_type ( ) . clone ( ) ) ;
547547 nested_item_nullability. push ( Some ( field. is_nullable ( ) ) ) ;
548548 large_list = true ;
@@ -580,6 +580,8 @@ fn get_valid_types(
580580 ArrayFunctionArgument :: Index => DataType :: Int64 ,
581581 ArrayFunctionArgument :: String => DataType :: Utf8 ,
582582 ArrayFunctionArgument :: Element => element_type. clone ( ) ,
583+ // TODO: support maintaining ListView types here
584+ // https://github.com/apache/datafusion/issues/21777
583585 ArrayFunctionArgument :: Array => {
584586 if current_type. is_null ( ) {
585587 DataType :: Null
@@ -611,6 +613,8 @@ fn get_valid_types(
611613 match array_type {
612614 DataType :: List ( _)
613615 | DataType :: LargeList ( _)
616+ | DataType :: ListView ( _)
617+ | DataType :: LargeListView ( _)
614618 | DataType :: FixedSizeList ( _, _) => {
615619 let array_type = coerced_fixed_size_list_to_list ( array_type) ;
616620 Some ( array_type)
@@ -1044,7 +1048,7 @@ fn coerced_from<'a>(
10441048
10451049 // Only accept list and largelist with the same number of dimensions unless the type is Null.
10461050 // List or LargeList with different dimensions should be handled in TypeSignature or other places before this
1047- ( List ( _) | LargeList ( _) , _)
1051+ ( List ( _) | LargeList ( _) | ListView ( _ ) | LargeListView ( _ ) , _)
10481052 if base_type ( type_from) . is_null ( )
10491053 || list_ndims ( type_from) == list_ndims ( type_into) =>
10501054 {
@@ -1495,6 +1499,54 @@ mod tests {
14951499 ] ]
14961500 ) ;
14971501
1502+ let data_types = vec ! [
1503+ DataType :: ListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1504+ DataType :: new_list( DataType :: Int32 , true ) ,
1505+ ] ;
1506+ assert_eq ! (
1507+ get_valid_types( function, & signature. type_signature, & data_types) ?,
1508+ vec![ vec![
1509+ DataType :: new_list( DataType :: Int32 , true ) ,
1510+ DataType :: new_list( DataType :: Int32 , true ) ,
1511+ ] ]
1512+ ) ;
1513+
1514+ let data_types = vec ! [
1515+ DataType :: LargeListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1516+ DataType :: new_list( DataType :: Int32 , true ) ,
1517+ ] ;
1518+ assert_eq ! (
1519+ get_valid_types( function, & signature. type_signature, & data_types) ?,
1520+ vec![ vec![
1521+ DataType :: new_large_list( DataType :: Int32 , true ) ,
1522+ DataType :: new_large_list( DataType :: Int32 , true ) ,
1523+ ] ]
1524+ ) ;
1525+
1526+ let data_types = vec ! [
1527+ DataType :: ListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1528+ DataType :: ListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1529+ ] ;
1530+ assert_eq ! (
1531+ get_valid_types( function, & signature. type_signature, & data_types) ?,
1532+ vec![ vec![
1533+ DataType :: new_list( DataType :: Int32 , true ) ,
1534+ DataType :: new_list( DataType :: Int32 , true ) ,
1535+ ] ]
1536+ ) ;
1537+
1538+ let data_types = vec ! [
1539+ DataType :: LargeListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1540+ DataType :: LargeListView ( Field :: new_list_field( DataType :: Int32 , true ) . into( ) ) ,
1541+ ] ;
1542+ assert_eq ! (
1543+ get_valid_types( function, & signature. type_signature, & data_types) ?,
1544+ vec![ vec![
1545+ DataType :: new_large_list( DataType :: Int32 , true ) ,
1546+ DataType :: new_large_list( DataType :: Int32 , true ) ,
1547+ ] ]
1548+ ) ;
1549+
14981550 Ok ( ( ) )
14991551 }
15001552
0 commit comments