Skip to content

Commit c2ac111

Browse files
committed
feat: interval add timestamp
1 parent 17b2f11 commit c2ac111

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

datafusion/common/src/scalar.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,18 +516,34 @@ macro_rules! impl_op {
516516
let value = seconds_add(*ts_s, $RHS, get_sign!($OPERATION))?;
517517
Ok(ScalarValue::TimestampSecond(Some(value), zone.clone()))
518518
}
519+
(_, ScalarValue::TimestampSecond(Some(ts_s), zone)) => {
520+
let value = seconds_add(*ts_s, $LHS, get_sign!($OPERATION))?;
521+
Ok(ScalarValue::TimestampSecond(Some(value), zone.clone()))
522+
}
519523
(ScalarValue::TimestampMillisecond(Some(ts_ms), zone), _) => {
520524
let value = milliseconds_add(*ts_ms, $RHS, get_sign!($OPERATION))?;
521525
Ok(ScalarValue::TimestampMillisecond(Some(value), zone.clone()))
522526
}
527+
(_, ScalarValue::TimestampMillisecond(Some(ts_ms), zone)) => {
528+
let value = milliseconds_add(*ts_ms, $LHS, get_sign!($OPERATION))?;
529+
Ok(ScalarValue::TimestampMillisecond(Some(value), zone.clone()))
530+
}
523531
(ScalarValue::TimestampMicrosecond(Some(ts_us), zone), _) => {
524532
let value = microseconds_add(*ts_us, $RHS, get_sign!($OPERATION))?;
525533
Ok(ScalarValue::TimestampMicrosecond(Some(value), zone.clone()))
526534
}
535+
(_, ScalarValue::TimestampMicrosecond(Some(ts_us), zone)) => {
536+
let value = microseconds_add(*ts_us, $LHS, get_sign!($OPERATION))?;
537+
Ok(ScalarValue::TimestampMicrosecond(Some(value), zone.clone()))
538+
}
527539
(ScalarValue::TimestampNanosecond(Some(ts_ns), zone), _) => {
528540
let value = nanoseconds_add(*ts_ns, $RHS, get_sign!($OPERATION))?;
529541
Ok(ScalarValue::TimestampNanosecond(Some(value), zone.clone()))
530542
}
543+
(_, ScalarValue::TimestampNanosecond(Some(ts_ns), zone)) => {
544+
let value = nanoseconds_add(*ts_ns, $LHS, get_sign!($OPERATION))?;
545+
Ok(ScalarValue::TimestampNanosecond(Some(value), zone.clone()))
546+
}
531547
_ => Err(DataFusionError::Internal(format!(
532548
"Operator {} is not implemented for types {:?} and {:?}",
533549
stringify!($OPERATION),
@@ -2911,6 +2927,37 @@ mod tests {
29112927
Ok(())
29122928
}
29132929

2930+
#[test]
2931+
fn test_interval_add_timestamp() -> Result<()> {
2932+
let interval = ScalarValue::IntervalMonthDayNano(Some(123));
2933+
let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
2934+
let result = interval.add(&timestamp)?;
2935+
let expect = timestamp.add(&interval)?;
2936+
assert_eq!(
2937+
result,
2938+
expect
2939+
);
2940+
2941+
let interval = ScalarValue::IntervalYearMonth(Some(123));
2942+
let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
2943+
let result = interval.add(&timestamp)?;
2944+
let expect = timestamp.add(&interval)?;
2945+
assert_eq!(
2946+
result,
2947+
expect
2948+
);
2949+
2950+
let interval = ScalarValue::IntervalDayTime(Some(123));
2951+
let timestamp = ScalarValue::TimestampNanosecond(Some(123), None);
2952+
let result = interval.add(&timestamp)?;
2953+
let expect = timestamp.add(&interval)?;
2954+
assert_eq!(
2955+
result,
2956+
expect
2957+
);
2958+
Ok(())
2959+
}
2960+
29142961
#[test]
29152962
fn scalar_decimal_test() -> Result<()> {
29162963
let decimal_value = ScalarValue::Decimal128(Some(123), 10, 1);

0 commit comments

Comments
 (0)