From 8e65992f3609b871d61c2df258311b43aeda955c Mon Sep 17 00:00:00 2001 From: Weijun Huang Date: Mon, 6 Mar 2023 22:46:27 +0100 Subject: [PATCH] feat: interval add timestamp --- datafusion/common/src/scalar.rs | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/datafusion/common/src/scalar.rs b/datafusion/common/src/scalar.rs index c31b37b63b21..c094c10734d9 100644 --- a/datafusion/common/src/scalar.rs +++ b/datafusion/common/src/scalar.rs @@ -516,18 +516,34 @@ macro_rules! impl_op { let value = seconds_add(*ts_s, $RHS, get_sign!($OPERATION))?; Ok(ScalarValue::TimestampSecond(Some(value), zone.clone())) } + (_, ScalarValue::TimestampSecond(Some(ts_s), zone)) => { + let value = seconds_add(*ts_s, $LHS, get_sign!($OPERATION))?; + Ok(ScalarValue::TimestampSecond(Some(value), zone.clone())) + } (ScalarValue::TimestampMillisecond(Some(ts_ms), zone), _) => { let value = milliseconds_add(*ts_ms, $RHS, get_sign!($OPERATION))?; Ok(ScalarValue::TimestampMillisecond(Some(value), zone.clone())) } + (_, ScalarValue::TimestampMillisecond(Some(ts_ms), zone)) => { + let value = milliseconds_add(*ts_ms, $LHS, get_sign!($OPERATION))?; + Ok(ScalarValue::TimestampMillisecond(Some(value), zone.clone())) + } (ScalarValue::TimestampMicrosecond(Some(ts_us), zone), _) => { let value = microseconds_add(*ts_us, $RHS, get_sign!($OPERATION))?; Ok(ScalarValue::TimestampMicrosecond(Some(value), zone.clone())) } + (_, ScalarValue::TimestampMicrosecond(Some(ts_us), zone)) => { + let value = microseconds_add(*ts_us, $LHS, get_sign!($OPERATION))?; + Ok(ScalarValue::TimestampMicrosecond(Some(value), zone.clone())) + } (ScalarValue::TimestampNanosecond(Some(ts_ns), zone), _) => { let value = nanoseconds_add(*ts_ns, $RHS, get_sign!($OPERATION))?; Ok(ScalarValue::TimestampNanosecond(Some(value), zone.clone())) } + (_, ScalarValue::TimestampNanosecond(Some(ts_ns), zone)) => { + let value = nanoseconds_add(*ts_ns, $LHS, get_sign!($OPERATION))?; + Ok(ScalarValue::TimestampNanosecond(Some(value), zone.clone())) + } _ => Err(DataFusionError::Internal(format!( "Operator {} is not implemented for types {:?} and {:?}", stringify!($OPERATION), @@ -2911,6 +2927,28 @@ mod tests { Ok(()) } + #[test] + fn test_interval_add_timestamp() -> Result<()> { + let interval = ScalarValue::IntervalMonthDayNano(Some(123)); + let timestamp = ScalarValue::TimestampNanosecond(Some(123), None); + let result = interval.add(×tamp)?; + let expect = timestamp.add(&interval)?; + assert_eq!(result, expect); + + let interval = ScalarValue::IntervalYearMonth(Some(123)); + let timestamp = ScalarValue::TimestampNanosecond(Some(123), None); + let result = interval.add(×tamp)?; + let expect = timestamp.add(&interval)?; + assert_eq!(result, expect); + + let interval = ScalarValue::IntervalDayTime(Some(123)); + let timestamp = ScalarValue::TimestampNanosecond(Some(123), None); + let result = interval.add(×tamp)?; + let expect = timestamp.add(&interval)?; + assert_eq!(result, expect); + Ok(()) + } + #[test] fn scalar_decimal_test() -> Result<()> { let decimal_value = ScalarValue::Decimal128(Some(123), 10, 1);