Skip to content

Commit 6bec627

Browse files
committed
add_int_timestamp_support
1 parent 97a40df commit 6bec627

2 files changed

Lines changed: 97 additions & 1 deletion

File tree

native/spark-expr/src/conversion_funcs/cast.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

spark/src/main/scala/org/apache/comet/expressions/CometCast.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ object CometCast extends CometExpressionSerde[Cast] with CometExprShim {
249249
private def canCastFromTimestamp(toType: DataType): SupportLevel = {
250250
toType match {
251251
case DataTypes.BooleanType | DataTypes.ByteType | DataTypes.ShortType |
252-
DataTypes.IntegerType =>
252+
DataTypes.IntegerType =>
253253
// https://github.com/apache/datafusion-comet/issues/352
254254
// this seems like an edge case that isn't important for us to support
255255
unsupported(DataTypes.TimestampType, toType)

0 commit comments

Comments
 (0)