@@ -132,3 +132,70 @@ impl ScalarUDFImpl for ChrFunc {
132132 self . doc ( )
133133 }
134134}
135+
136+ #[ cfg( test) ]
137+ mod tests {
138+ use super :: * ;
139+ use arrow:: array:: { Array , Int64Array , StringArray } ;
140+ use datafusion_common:: assert_contains;
141+
142+ #[ test]
143+ fn test_chr_normal ( ) {
144+ let input = Arc :: new ( Int64Array :: from ( vec ! [
145+ Some ( 65 ) , // A
146+ Some ( 66 ) , // B
147+ Some ( 67 ) , // C
148+ Some ( 128640 ) , // 🚀
149+ Some ( 8364 ) , // €
150+ Some ( 945 ) , // α
151+ None , // NULL
152+ Some ( 32 ) , // space
153+ Some ( 10 ) , // newline
154+ Some ( 9 ) , // tab
155+ ] ) ) ;
156+ let result = chr ( & [ input] ) . unwrap ( ) ;
157+ let string_array = result. as_any ( ) . downcast_ref :: < StringArray > ( ) . unwrap ( ) ;
158+ let expected = vec ! [ "A" , "B" , "C" , "🚀" , "€" , "α" , "" , " " , "\n " , "\t " ] ;
159+
160+ assert_eq ! ( string_array. len( ) , 10 ) ;
161+ for i in 0 ..string_array. len ( ) {
162+ assert_eq ! ( string_array. value( i) , expected[ i] ) ;
163+ }
164+ }
165+
166+ #[ test]
167+ fn test_chr_error ( ) {
168+ // chr(0) returns an error
169+ let input = Arc :: new ( Int64Array :: from ( vec ! [ 0 ] ) ) ;
170+ let result = chr ( & [ input] ) ;
171+ assert ! ( result. is_err( ) ) ;
172+ assert_contains ! (
173+ result. err( ) . unwrap( ) . to_string( ) ,
174+ "null character not permitted"
175+ ) ;
176+
177+ // invalid Unicode code points (too large)
178+ let input = Arc :: new ( Int64Array :: from ( vec ! [ i64 :: MAX ] ) ) ;
179+ let result = chr ( & [ input] ) ;
180+ assert ! ( result. is_err( ) ) ;
181+ assert_contains ! (
182+ result. err( ) . unwrap( ) . to_string( ) ,
183+ "requested character too large for encoding"
184+ ) ;
185+
186+ // one error with valid values after
187+ let input = Arc :: new ( Int64Array :: from ( vec ! [ 65 , 0 , 66 ] ) ) ; // A, NULL_CHAR, B
188+ let result = chr ( & [ input] ) ;
189+ assert ! ( result. is_err( ) ) ;
190+ assert_contains ! (
191+ result. err( ) . unwrap( ) . to_string( ) ,
192+ "null character not permitted"
193+ ) ;
194+
195+ // empty input array
196+ let input = Arc :: new ( Int64Array :: from ( Vec :: < i64 > :: new ( ) ) ) ;
197+ let result = chr ( & [ input] ) . unwrap ( ) ;
198+ let string_array = result. as_any ( ) . downcast_ref :: < StringArray > ( ) . unwrap ( ) ;
199+ assert_eq ! ( string_array. len( ) , 0 ) ;
200+ }
201+ }
0 commit comments