@@ -929,9 +929,7 @@ fn cast_array(
929929 ( Boolean , Decimal128 ( precision, scale) ) => {
930930 cast_boolean_to_decimal ( & array, * precision, * scale)
931931 }
932- ( Int8 | Int16 | Int32 | Int64 , Timestamp ( _, _) ) => {
933- cast_int_to_timestamp ( & array, cast_options)
934- }
932+ ( Int8 | Int16 | Int32 | Int64 , Timestamp ( _, tz) ) => cast_int_to_timestamp ( & array, tz) ,
935933 _ if cast_options. is_adapting_schema
936934 || is_datafusion_spark_compatible ( from_type, to_type) =>
937935 {
@@ -952,7 +950,7 @@ fn cast_array(
952950
953951fn cast_int_to_timestamp (
954952 array_ref : & ArrayRef ,
955- cast_options : & SparkCastOptions ,
953+ target_tz : & Option < Arc < str > > ,
956954) -> SparkResult < ArrayRef > {
957955 // Input is seconds since epoch, multiply by MICROS_PER_SECOND to get microseconds.
958956 let mut builder = TimestampMicrosecondBuilder :: with_capacity ( array_ref. len ( ) ) ;
@@ -970,9 +968,7 @@ fn cast_int_to_timestamp(
970968 }
971969 }
972970
973- // input tz is always defined or set to UTC on spark side
974- let tz: Arc < str > = Arc :: from ( cast_options. timezone . as_str ( ) ) ;
975- Ok ( Arc :: new ( builder. finish ( ) . with_timezone ( tz) ) as ArrayRef )
971+ Ok ( Arc :: new ( builder. finish ( ) . with_timezone_opt ( target_tz. clone ( ) ) ) as ArrayRef )
976972}
977973
978974fn cast_date_to_timestamp (
@@ -3564,97 +3560,91 @@ mod tests {
35643560
35653561 #[ test]
35663562 fn test_cast_int_to_timestamp ( ) {
3567- let timezones = [
3568- "UTC" ,
3569- "America/New_York" ,
3570- "America/Los_Angeles" ,
3571- "Europe/London" ,
3572- "Asia/Tokyo" ,
3573- "Australia/Sydney" ,
3563+ let timezones: [ Option < Arc < str > > ; 6 ] = [
3564+ Some ( Arc :: from ( "UTC" ) ) ,
3565+ Some ( Arc :: from ( "America/New_York" ) ) ,
3566+ Some ( Arc :: from ( "America/Los_Angeles" ) ) ,
3567+ Some ( Arc :: from ( "Europe/London" ) ) ,
3568+ Some ( Arc :: from ( "Asia/Tokyo" ) ) ,
3569+ Some ( Arc :: from ( "Australia/Sydney" ) ) ,
35743570 ] ;
35753571
3576- let eval_modes = [ EvalMode :: Legacy , EvalMode :: Ansi , EvalMode :: Try ] ;
3577-
3578- for tz in timezones {
3579- for eval_mode in & eval_modes {
3580- let cast_options = SparkCastOptions :: new ( * eval_mode, tz, false ) ;
3581-
3582- let int8_array: ArrayRef = Arc :: new ( Int8Array :: from ( vec ! [
3583- Some ( 0 ) ,
3584- Some ( 1 ) ,
3585- Some ( -1 ) ,
3586- Some ( 127 ) ,
3587- Some ( -128 ) ,
3588- None ,
3589- ] ) ) ;
3590-
3591- let result = cast_int_to_timestamp ( & int8_array, & cast_options) . unwrap ( ) ;
3592- let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3593-
3594- assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3595- assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3596- assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3597- assert_eq ! ( ts_array. value( 3 ) , 127_000_000 ) ;
3598- assert_eq ! ( ts_array. value( 4 ) , -128_000_000 ) ;
3599- assert ! ( ts_array. is_null( 5 ) ) ;
3600- assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3601-
3602- let int16_array: ArrayRef = Arc :: new ( Int16Array :: from ( vec ! [
3603- Some ( 0 ) ,
3604- Some ( 1 ) ,
3605- Some ( -1 ) ,
3606- Some ( 32767 ) ,
3607- Some ( -32768 ) ,
3608- None ,
3609- ] ) ) ;
3610-
3611- let result = cast_int_to_timestamp ( & int16_array, & cast_options) . unwrap ( ) ;
3612- let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3613-
3614- assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3615- assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3616- assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3617- assert_eq ! ( ts_array. value( 3 ) , 32_767_000_000_i64 ) ;
3618- assert_eq ! ( ts_array. value( 4 ) , -32_768_000_000_i64 ) ;
3619- assert ! ( ts_array. is_null( 5 ) ) ;
3620- assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3621-
3622- let int32_array: ArrayRef = Arc :: new ( Int32Array :: from ( vec ! [
3623- Some ( 0 ) ,
3624- Some ( 1 ) ,
3625- Some ( -1 ) ,
3626- Some ( 1704067200 ) ,
3627- None ,
3628- ] ) ) ;
3629-
3630- let result = cast_int_to_timestamp ( & int32_array, & cast_options) . unwrap ( ) ;
3631- let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3632-
3633- assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3634- assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3635- assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3636- assert_eq ! ( ts_array. value( 3 ) , 1_704_067_200_000_000_i64 ) ;
3637- assert ! ( ts_array. is_null( 4 ) ) ;
3638- assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3639-
3640- let int64_array: ArrayRef = Arc :: new ( Int64Array :: from ( vec ! [
3641- Some ( 0 ) ,
3642- Some ( 1 ) ,
3643- Some ( -1 ) ,
3644- Some ( i64 :: MAX ) ,
3645- Some ( i64 :: MIN ) ,
3646- ] ) ) ;
3647-
3648- let result = cast_int_to_timestamp ( & int64_array, & cast_options) . unwrap ( ) ;
3649- let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3650-
3651- assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3652- assert_eq ! ( ts_array. value( 1 ) , 1_000_000_i64 ) ;
3653- assert_eq ! ( ts_array. value( 2 ) , -1_000_000_i64 ) ;
3654- assert_eq ! ( ts_array. value( 3 ) , i64 :: MAX ) ;
3655- assert_eq ! ( ts_array. value( 4 ) , i64 :: MIN ) ;
3656- assert_eq ! ( ts_array. timezone( ) , Some ( tz) ) ;
3657- }
3572+ for tz in & timezones {
3573+ let int8_array: ArrayRef = Arc :: new ( Int8Array :: from ( vec ! [
3574+ Some ( 0 ) ,
3575+ Some ( 1 ) ,
3576+ Some ( -1 ) ,
3577+ Some ( 127 ) ,
3578+ Some ( -128 ) ,
3579+ None ,
3580+ ] ) ) ;
3581+
3582+ let result = cast_int_to_timestamp ( & int8_array, tz) . unwrap ( ) ;
3583+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3584+
3585+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3586+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3587+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3588+ assert_eq ! ( ts_array. value( 3 ) , 127_000_000 ) ;
3589+ assert_eq ! ( ts_array. value( 4 ) , -128_000_000 ) ;
3590+ assert ! ( ts_array. is_null( 5 ) ) ;
3591+ assert_eq ! ( ts_array. timezone( ) , tz. as_ref( ) . map( |s| s. as_ref( ) ) ) ;
3592+
3593+ let int16_array: ArrayRef = Arc :: new ( Int16Array :: from ( vec ! [
3594+ Some ( 0 ) ,
3595+ Some ( 1 ) ,
3596+ Some ( -1 ) ,
3597+ Some ( 32767 ) ,
3598+ Some ( -32768 ) ,
3599+ None ,
3600+ ] ) ) ;
3601+
3602+ let result = cast_int_to_timestamp ( & int16_array, tz) . unwrap ( ) ;
3603+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3604+
3605+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3606+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3607+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3608+ assert_eq ! ( ts_array. value( 3 ) , 32_767_000_000_i64 ) ;
3609+ assert_eq ! ( ts_array. value( 4 ) , -32_768_000_000_i64 ) ;
3610+ assert ! ( ts_array. is_null( 5 ) ) ;
3611+ assert_eq ! ( ts_array. timezone( ) , tz. as_ref( ) . map( |s| s. as_ref( ) ) ) ;
3612+
3613+ let int32_array: ArrayRef = Arc :: new ( Int32Array :: from ( vec ! [
3614+ Some ( 0 ) ,
3615+ Some ( 1 ) ,
3616+ Some ( -1 ) ,
3617+ Some ( 1704067200 ) ,
3618+ None ,
3619+ ] ) ) ;
3620+
3621+ let result = cast_int_to_timestamp ( & int32_array, tz) . unwrap ( ) ;
3622+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3623+
3624+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3625+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000 ) ;
3626+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000 ) ;
3627+ assert_eq ! ( ts_array. value( 3 ) , 1_704_067_200_000_000_i64 ) ;
3628+ assert ! ( ts_array. is_null( 4 ) ) ;
3629+ assert_eq ! ( ts_array. timezone( ) , tz. as_ref( ) . map( |s| s. as_ref( ) ) ) ;
3630+
3631+ let int64_array: ArrayRef = Arc :: new ( Int64Array :: from ( vec ! [
3632+ Some ( 0 ) ,
3633+ Some ( 1 ) ,
3634+ Some ( -1 ) ,
3635+ Some ( i64 :: MAX ) ,
3636+ Some ( i64 :: MIN ) ,
3637+ ] ) ) ;
3638+
3639+ let result = cast_int_to_timestamp ( & int64_array, tz) . unwrap ( ) ;
3640+ let ts_array = result. as_primitive :: < TimestampMicrosecondType > ( ) ;
3641+
3642+ assert_eq ! ( ts_array. value( 0 ) , 0 ) ;
3643+ assert_eq ! ( ts_array. value( 1 ) , 1_000_000_i64 ) ;
3644+ assert_eq ! ( ts_array. value( 2 ) , -1_000_000_i64 ) ;
3645+ assert_eq ! ( ts_array. value( 3 ) , i64 :: MAX ) ;
3646+ assert_eq ! ( ts_array. value( 4 ) , i64 :: MIN ) ;
3647+ assert_eq ! ( ts_array. timezone( ) , tz. as_ref( ) . map( |s| s. as_ref( ) ) ) ;
36583648 }
36593649 }
36603650}
0 commit comments