@@ -65,9 +65,12 @@ mod tests {
6565 use crate :: arrays:: BoolArray ;
6666 use crate :: arrays:: PrimitiveArray ;
6767 use crate :: arrays:: ScalarFnArray ;
68+ use crate :: arrays:: scalar_fn:: ScalarFnArrayExt ;
6869 use crate :: assert_arrays_eq;
70+ use crate :: scalar:: Scalar ;
6971 use crate :: scalar_fn:: TypedScalarFnInstance ;
7072 use crate :: scalar_fn:: fns:: binary:: Binary ;
73+ use crate :: scalar_fn:: fns:: literal:: Literal ;
7174 use crate :: scalar_fn:: fns:: operators:: Operator ;
7275 use crate :: validity:: Validity ;
7376
@@ -77,7 +80,9 @@ mod tests {
7780 let rhs = buffer ! [ 10i32 , 20 , 30 ] . into_array ( ) ;
7881
7982 let scalar_fn = TypedScalarFnInstance :: new ( Binary , Operator :: Add ) . erased ( ) ;
80- let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] , 3 ) ?;
83+ let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] ) ?;
84+
85+ assert_eq ! ( scalar_fn_array. len( ) , 3 ) ;
8186
8287 let result = scalar_fn_array
8388 . into_array ( )
@@ -89,13 +94,47 @@ mod tests {
8994 Ok ( ( ) )
9095 }
9196
97+ #[ test]
98+ fn test_scalar_fn_inferred_len_rejects_mismatched_children ( ) {
99+ let lhs = buffer ! [ 1i32 , 2 , 3 ] . into_array ( ) ;
100+ let rhs = buffer ! [ 10i32 , 20 ] . into_array ( ) ;
101+
102+ let scalar_fn = TypedScalarFnInstance :: new ( Binary , Operator :: Add ) . erased ( ) ;
103+ let err = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] )
104+ . expect_err ( "ScalarFnArray::try_new must reject mismatched child lengths" ) ;
105+
106+ assert ! (
107+ err. to_string( )
108+ . contains( "ScalarFnArray must have children equal to the array length" )
109+ ) ;
110+ }
111+
112+ #[ test]
113+ fn test_scalar_fn_without_children_requires_explicit_len ( ) -> VortexResult < ( ) > {
114+ let scalar_fn = TypedScalarFnInstance :: new ( Literal , Scalar :: from ( 1i32 ) ) . erased ( ) ;
115+
116+ let Err ( err) = ScalarFnArray :: try_new ( scalar_fn. clone ( ) , vec ! [ ] ) else {
117+ panic ! ( "ScalarFnArray::try_new should reject zero children" ) ;
118+ } ;
119+ assert ! (
120+ err. to_string( )
121+ . contains( "ScalarFnArray length cannot be inferred without children" )
122+ ) ;
123+
124+ let scalar_fn_array = ScalarFnArray :: try_new_with_len ( scalar_fn, vec ! [ ] , 3 ) ?;
125+ assert_eq ! ( scalar_fn_array. len( ) , 3 ) ;
126+ assert_eq ! ( scalar_fn_array. child_count( ) , 0 ) ;
127+
128+ Ok ( ( ) )
129+ }
130+
92131 #[ test]
93132 fn test_scalar_fn_mul ( ) -> VortexResult < ( ) > {
94133 let lhs = buffer ! [ 2i32 , 3 , 4 ] . into_array ( ) ;
95134 let rhs = buffer ! [ 5i32 , 6 , 7 ] . into_array ( ) ;
96135
97136 let scalar_fn = TypedScalarFnInstance :: new ( Binary , Operator :: Mul ) . erased ( ) ;
98- let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] , 3 ) ?;
137+ let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] ) ?;
99138
100139 let result = scalar_fn_array
101140 . into_array ( )
@@ -117,7 +156,7 @@ mod tests {
117156 . into_array ( ) ;
118157
119158 let scalar_fn = TypedScalarFnInstance :: new ( Binary , Operator :: Add ) . erased ( ) ;
120- let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] , 3 ) ?;
159+ let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] ) ?;
121160
122161 let result = scalar_fn_array
123162 . into_array ( )
@@ -139,7 +178,7 @@ mod tests {
139178 let rhs = buffer ! [ 2i32 , 5 , 1 ] . into_array ( ) ;
140179
141180 let scalar_fn = TypedScalarFnInstance :: new ( Binary , Operator :: Eq ) . erased ( ) ;
142- let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] , 3 ) ?;
181+ let scalar_fn_array = ScalarFnArray :: try_new ( scalar_fn, vec ! [ lhs, rhs] ) ?;
143182
144183 let result = scalar_fn_array
145184 . into_array ( )
0 commit comments