@@ -265,6 +265,10 @@ fn to_char_array(args: &[ColumnarValue]) -> Result<ColumnarValue> {
265265
266266 buffer. clear ( ) ;
267267
268+ // We'd prefer to write directly to the StringBuilder's internal buffer,
269+ // but the write might fail, and there's no easy way to ensure a partial
270+ // write is removed from the buffer. So instead we write to a temporary
271+ // buffer and `append_value` on success.
268272 match formatter. value ( idx) . write ( & mut buffer) {
269273 Ok ( ( ) ) => builder. append_value ( & buffer) ,
270274 Err ( _) if data_type == & Date32 => {
@@ -313,11 +317,21 @@ mod tests {
313317
314318 #[ test]
315319 fn test_array_array ( ) {
316- let array_array_data = vec ! [ (
317- Arc :: new( Date32Array :: from( vec![ 18506 , 18507 ] ) ) as ArrayRef ,
318- StringArray :: from( vec![ "%Y::%m::%d" , "%Y::%m::%d %S::%M::%H %f" ] ) ,
319- StringArray :: from( vec![ "2020::09::01" , "2020::09::02 00::00::00 000000000" ] ) ,
320- ) ] ;
320+ let array_array_data = vec ! [
321+ (
322+ Arc :: new( Date32Array :: from( vec![ 18506 , 18507 ] ) ) as ArrayRef ,
323+ StringArray :: from( vec![ "%Y::%m::%d" , "%Y::%m::%d %S::%M::%H %f" ] ) ,
324+ StringArray :: from( vec![
325+ "2020::09::01" ,
326+ "2020::09::02 00::00::00 000000000" ,
327+ ] ) ,
328+ ) ,
329+ (
330+ Arc :: new( Date32Array :: from( vec![ 18506 , 18507 ] ) ) as ArrayRef ,
331+ StringArray :: from( vec![ "%Y::%m::%d %H:%M:%S" , "%d-%m-%Y %H:%M" ] ) ,
332+ StringArray :: from( vec![ "2020::09::01 00:00:00" , "02-09-2020 00:00" ] ) ,
333+ ) ,
334+ ] ;
321335
322336 for ( value, format, expected) in array_array_data {
323337 let batch_len = value. len ( ) ;
0 commit comments