@@ -228,10 +228,10 @@ fn compute_array_dims(arr: Option<ArrayRef>) -> Result<Option<Vec<Option<u64>>>>
228
228
229
229
fn check_datatypes ( name : & str , args : & [ & ArrayRef ] ) -> Result < ( ) > {
230
230
let data_type = args[ 0 ] . data_type ( ) ;
231
- if !args
232
- . iter ( )
233
- . all ( |arg | arg. data_type ( ) . equals_datatype ( data_type ) )
234
- {
231
+ if !args. iter ( ) . all ( |arg| {
232
+ arg . data_type ( ) . equals_datatype ( data_type )
233
+ | | arg. data_type ( ) . equals_datatype ( & DataType :: Null )
234
+ } ) {
235
235
let types = args. iter ( ) . map ( |arg| arg. data_type ( ) ) . collect :: < Vec < _ > > ( ) ;
236
236
return plan_err ! ( "{name} received incompatible types: '{types:?}'." ) ;
237
237
}
@@ -580,21 +580,6 @@ pub fn array_except(args: &[ArrayRef]) -> Result<ArrayRef> {
580
580
let array2 = & args[ 1 ] ;
581
581
582
582
match ( array1. data_type ( ) , array2. data_type ( ) ) {
583
- ( DataType :: Null , DataType :: Null ) => {
584
- // NullArray(1): means null, NullArray(0): means []
585
- // except([], []) = [], except([], null) = [], except(null, []) = null, except(null, null) = null
586
- let nulls = match ( array1. len ( ) , array2. len ( ) ) {
587
- ( 1 , _) => Some ( NullBuffer :: new_null ( 1 ) ) ,
588
- _ => None ,
589
- } ;
590
- let arr = Arc :: new ( ListArray :: try_new (
591
- Arc :: new ( Field :: new ( "item" , DataType :: Null , true ) ) ,
592
- OffsetBuffer :: new ( vec ! [ 0 ; 2 ] . into ( ) ) ,
593
- Arc :: new ( NullArray :: new ( 0 ) ) ,
594
- nulls,
595
- ) ?) as ArrayRef ;
596
- Ok ( arr)
597
- }
598
583
( DataType :: Null , _) | ( _, DataType :: Null ) => Ok ( array1. to_owned ( ) ) ,
599
584
( DataType :: List ( field) , DataType :: List ( _) ) => {
600
585
check_datatypes ( "array_except" , & [ array1, array2] ) ?;
@@ -1525,36 +1510,31 @@ pub fn array_union(args: &[ArrayRef]) -> Result<ArrayRef> {
1525
1510
let array1 = & args[ 0 ] ;
1526
1511
let array2 = & args[ 1 ] ;
1527
1512
match ( array1. data_type ( ) , array2. data_type ( ) ) {
1528
- ( DataType :: Null , DataType :: Null ) => {
1529
- // NullArray(1): means null, NullArray(0): means []
1530
- // union([], []) = [], union([], null) = [], union(null, []) = [], union(null, null) = null
1531
- let nulls = match ( array1. len ( ) , array2. len ( ) ) {
1532
- ( 1 , 1 ) => Some ( NullBuffer :: new_null ( 1 ) ) ,
1533
- _ => None ,
1534
- } ;
1535
- let arr = Arc :: new ( ListArray :: try_new (
1536
- Arc :: new ( Field :: new ( "item" , DataType :: Null , true ) ) ,
1537
- OffsetBuffer :: new ( vec ! [ 0 ; 2 ] . into ( ) ) ,
1538
- Arc :: new ( NullArray :: new ( 0 ) ) ,
1539
- nulls,
1540
- ) ?) as ArrayRef ;
1541
- Ok ( arr)
1542
- }
1543
1513
( DataType :: Null , _) => Ok ( array2. clone ( ) ) ,
1544
1514
( _, DataType :: Null ) => Ok ( array1. clone ( ) ) ,
1545
- ( DataType :: List ( field_ref) , DataType :: List ( _) ) => {
1546
- check_datatypes ( "array_union" , & [ array1, array2] ) ?;
1547
- let list1 = array1. as_list :: < i32 > ( ) ;
1548
- let list2 = array2. as_list :: < i32 > ( ) ;
1549
- let result = union_generic_lists :: < i32 > ( list1, list2, field_ref) ?;
1550
- Ok ( Arc :: new ( result) )
1515
+ ( DataType :: List ( l_field_ref) , DataType :: List ( r_field_ref) ) => {
1516
+ match ( l_field_ref. data_type ( ) , r_field_ref. data_type ( ) ) {
1517
+ ( DataType :: Null , _) => Ok ( array2. clone ( ) ) ,
1518
+ ( _, DataType :: Null ) => Ok ( array1. clone ( ) ) ,
1519
+ ( _, _) => {
1520
+ let list1 = array1. as_list :: < i32 > ( ) ;
1521
+ let list2 = array2. as_list :: < i32 > ( ) ;
1522
+ let result = union_generic_lists :: < i32 > ( list1, list2, & l_field_ref) ?;
1523
+ Ok ( Arc :: new ( result) )
1524
+ }
1525
+ }
1551
1526
}
1552
- ( DataType :: LargeList ( field_ref) , DataType :: LargeList ( _) ) => {
1553
- check_datatypes ( "array_union" , & [ array1, array2] ) ?;
1554
- let list1 = array1. as_list :: < i64 > ( ) ;
1555
- let list2 = array2. as_list :: < i64 > ( ) ;
1556
- let result = union_generic_lists :: < i64 > ( list1, list2, field_ref) ?;
1557
- Ok ( Arc :: new ( result) )
1527
+ ( DataType :: LargeList ( l_field_ref) , DataType :: LargeList ( r_field_ref) ) => {
1528
+ match ( l_field_ref. data_type ( ) , r_field_ref. data_type ( ) ) {
1529
+ ( DataType :: Null , _) => Ok ( array2. clone ( ) ) ,
1530
+ ( _, DataType :: Null ) => Ok ( array1. clone ( ) ) ,
1531
+ ( _, _) => {
1532
+ let list1 = array1. as_list :: < i64 > ( ) ;
1533
+ let list2 = array2. as_list :: < i64 > ( ) ;
1534
+ let result = union_generic_lists :: < i64 > ( list1, list2, & l_field_ref) ?;
1535
+ Ok ( Arc :: new ( result) )
1536
+ }
1537
+ }
1558
1538
}
1559
1539
_ => {
1560
1540
internal_err ! (
@@ -2032,21 +2012,8 @@ pub fn array_intersect(args: &[ArrayRef]) -> Result<ArrayRef> {
2032
2012
let second_array = & args[ 1 ] ;
2033
2013
2034
2014
match ( first_array. data_type ( ) , second_array. data_type ( ) ) {
2035
- ( DataType :: Null , DataType :: Null ) => {
2036
- // NullArray(1): means null, NullArray(0): means []
2037
- // intersect([], []) = [], intersect([], null) = [], intersect(null, []) = [], intersect(null, null) = null
2038
- let nulls = match ( first_array. len ( ) , second_array. len ( ) ) {
2039
- ( 1 , 1 ) => Some ( NullBuffer :: new_null ( 1 ) ) ,
2040
- _ => None ,
2041
- } ;
2042
- let arr = Arc :: new ( ListArray :: try_new (
2043
- Arc :: new ( Field :: new ( "item" , DataType :: Null , true ) ) ,
2044
- OffsetBuffer :: new ( vec ! [ 0 ; 2 ] . into ( ) ) ,
2045
- Arc :: new ( NullArray :: new ( 0 ) ) ,
2046
- nulls,
2047
- ) ?) as ArrayRef ;
2048
- Ok ( arr)
2049
- }
2015
+ ( DataType :: Null , _) => Ok ( second_array. clone ( ) ) ,
2016
+ ( _, DataType :: Null ) => Ok ( first_array. clone ( ) ) ,
2050
2017
_ => {
2051
2018
let first_array = as_list_array ( & first_array) ?;
2052
2019
let second_array = as_list_array ( & second_array) ?;
0 commit comments