@@ -3546,4 +3546,100 @@ mod tests {
35463546 assert_eq ! ( r#"[null]"# , string_array. value( 2 ) ) ;
35473547 assert_eq ! ( r#"[]"# , string_array. value( 3 ) ) ;
35483548 }
3549+
3550+ #[ test]
3551+ fn test_cast_int_to_timestamp ( ) {
3552+ let timezones = [
3553+ "UTC" ,
3554+ "America/New_York" ,
3555+ "America/Los_Angeles" ,
3556+ "Europe/London" ,
3557+ "Asia/Tokyo" ,
3558+ "Australia/Sydney" ,
3559+ ] ;
3560+
3561+ let eval_modes = [ EvalMode :: Legacy , EvalMode :: Ansi , EvalMode :: Try ] ;
3562+
3563+ for tz in timezones {
3564+ for eval_mode in & eval_modes {
3565+ let cast_options = SparkCastOptions :: new ( * eval_mode, tz, false ) ;
3566+
3567+ let int8_array: ArrayRef = Arc :: new ( Int8Array :: from ( vec ! [
3568+ Some ( 0 ) ,
3569+ Some ( 1 ) ,
3570+ Some ( -1 ) ,
3571+ Some ( 127 ) ,
3572+ Some ( -128 ) ,
3573+ None ,
3574+ ] ) ) ;
3575+
3576+ let result = cast_int_to_timestamp ( & int8_array, & cast_options) . unwrap ( ) ;
3577+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3578+
3579+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3580+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3581+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3582+ assert_eq ! ( ts_array. value( 3 ) , 127_000_000 ) ;
3583+ assert_eq ! ( ts_array. value( 4 ) , -128_000_000 ) ;
3584+ assert ! ( ts_array. is_null( 5 ) ) ;
3585+ assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3586+
3587+ let int16_array: ArrayRef = Arc :: new ( Int16Array :: from ( vec ! [
3588+ Some ( 0 ) ,
3589+ Some ( 1 ) ,
3590+ Some ( -1 ) ,
3591+ Some ( 32767 ) ,
3592+ Some ( -32768 ) ,
3593+ None ,
3594+ ] ) ) ;
3595+
3596+ let result = cast_int_to_timestamp ( & int16_array, & cast_options) . unwrap ( ) ;
3597+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3598+
3599+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3600+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3601+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3602+ assert_eq ! ( ts_array. value( 3 ) , 32_767_000_000_i64 ) ;
3603+ assert_eq ! ( ts_array. value( 4 ) , -32_768_000_000_i64 ) ;
3604+ assert ! ( ts_array. is_null( 5 ) ) ;
3605+ assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3606+
3607+ let int32_array: ArrayRef = Arc :: new ( Int32Array :: from ( vec ! [
3608+ Some ( 0 ) ,
3609+ Some ( 1 ) ,
3610+ Some ( -1 ) ,
3611+ Some ( 1704067200 ) ,
3612+ None ,
3613+ ] ) ) ;
3614+
3615+ let result = cast_int_to_timestamp ( & int32_array, & cast_options) . unwrap ( ) ;
3616+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3617+
3618+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3619+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3620+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3621+ assert_eq ! ( ts_array. value( 3 ) , 1_704_067_200_000_000_i64 ) ;
3622+ assert ! ( ts_array. is_null( 4 ) ) ;
3623+ assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3624+
3625+ let int64_array: ArrayRef = Arc :: new ( Int64Array :: from ( vec ! [
3626+ Some ( 0 ) ,
3627+ Some ( 1 ) ,
3628+ Some ( -1 ) ,
3629+ Some ( i64 :: MAX ) ,
3630+ Some ( i64 :: MIN ) ,
3631+ ] ) ) ;
3632+
3633+ let result = cast_int_to_timestamp ( & int64_array, & cast_options) . unwrap ( ) ;
3634+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3635+
3636+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3637+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000_i64 ) ;
3638+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000_i64 ) ;
3639+ assert_eq ! ( ts_array. value( 3 ) , i64 :: MAX ) ;
3640+ assert_eq ! ( ts_array. value( 4 ) , i64 :: MIN ) ;
3641+ assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3642+ }
3643+ }
3644+ }
35493645}
0 commit comments