Skip to content

Commit de9ef08

Browse files
committed
fix(cubesql): Allow different Timestamp types in DATEDIFF
1 parent d2c5159 commit de9ef08

File tree

1 file changed

+35
-13
lines changed
  • rust/cubesql/cubesql/src/compile/engine

1 file changed

+35
-13
lines changed

rust/cubesql/cubesql/src/compile/engine/udf.rs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -771,23 +771,45 @@ pub fn create_datediff_udf() -> ScalarUDF {
771771
assert!(args.len() == 3);
772772

773773
let datepart_array = downcast_string_arg!(args[0], "datepart", i32);
774-
match (&args[1].data_type(), &args[2].data_type()) {
775-
(
776-
DataType::Timestamp(TimeUnit::Nanosecond, None),
777-
DataType::Timestamp(TimeUnit::Nanosecond, None),
778-
) => (),
779-
_ => {
774+
775+
let left_date_array = match args[1].data_type() {
776+
DataType::Timestamp(TimeUnit::Nanosecond, None) => Arc::clone(&args[1]),
777+
DataType::Timestamp(TimeUnit::Microsecond, None)
778+
| DataType::Timestamp(TimeUnit::Millisecond, None)
779+
| DataType::Timestamp(TimeUnit::Second, None) => cast_with_options(
780+
&args[1],
781+
&DataType::Timestamp(TimeUnit::Nanosecond, None),
782+
&CastOptions { safe: false },
783+
)?,
784+
t => {
780785
return Err(DataFusionError::Execution(format!(
781-
"date arguments must be of type TimestampNanosecond, actual: {}, {}",
782-
&args[1].data_type(),
783-
&args[2].data_type(),
784-
)));
786+
"second datediff argument must be of type Timestamp actual: {}",
787+
t
788+
)))
785789
}
786-
}
790+
};
791+
792+
let right_date_array = match args[2].data_type() {
793+
DataType::Timestamp(TimeUnit::Nanosecond, None) => Arc::clone(&args[2]),
794+
DataType::Timestamp(TimeUnit::Microsecond, None)
795+
| DataType::Timestamp(TimeUnit::Millisecond, None)
796+
| DataType::Timestamp(TimeUnit::Second, None) => cast_with_options(
797+
&args[2],
798+
&DataType::Timestamp(TimeUnit::Nanosecond, None),
799+
&CastOptions { safe: false },
800+
)?,
801+
t => {
802+
return Err(DataFusionError::Execution(format!(
803+
"third datediff argument must be of type Timestamp actual: {}",
804+
t
805+
)))
806+
}
807+
};
808+
787809
let left_date_array =
788-
downcast_primitive_arg!(args[1], "left_date", TimestampNanosecondType);
810+
downcast_primitive_arg!(left_date_array, "left_date", TimestampNanosecondType);
789811
let right_date_array =
790-
downcast_primitive_arg!(args[2], "right_date", TimestampNanosecondType);
812+
downcast_primitive_arg!(right_date_array, "right_date", TimestampNanosecondType);
791813

792814
let result = izip!(datepart_array, left_date_array, right_date_array)
793815
.map(|args| {

0 commit comments

Comments
 (0)