@@ -516,18 +516,34 @@ macro_rules! impl_op {
516
516
let value = seconds_add( * ts_s, $RHS, get_sign!( $OPERATION) ) ?;
517
517
Ok ( ScalarValue :: TimestampSecond ( Some ( value) , zone. clone( ) ) )
518
518
}
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
+ }
519
523
( ScalarValue :: TimestampMillisecond ( Some ( ts_ms) , zone) , _) => {
520
524
let value = milliseconds_add( * ts_ms, $RHS, get_sign!( $OPERATION) ) ?;
521
525
Ok ( ScalarValue :: TimestampMillisecond ( Some ( value) , zone. clone( ) ) )
522
526
}
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
+ }
523
531
( ScalarValue :: TimestampMicrosecond ( Some ( ts_us) , zone) , _) => {
524
532
let value = microseconds_add( * ts_us, $RHS, get_sign!( $OPERATION) ) ?;
525
533
Ok ( ScalarValue :: TimestampMicrosecond ( Some ( value) , zone. clone( ) ) )
526
534
}
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
+ }
527
539
( ScalarValue :: TimestampNanosecond ( Some ( ts_ns) , zone) , _) => {
528
540
let value = nanoseconds_add( * ts_ns, $RHS, get_sign!( $OPERATION) ) ?;
529
541
Ok ( ScalarValue :: TimestampNanosecond ( Some ( value) , zone. clone( ) ) )
530
542
}
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
+ }
531
547
_ => Err ( DataFusionError :: Internal ( format!(
532
548
"Operator {} is not implemented for types {:?} and {:?}" ,
533
549
stringify!( $OPERATION) ,
@@ -2911,6 +2927,37 @@ mod tests {
2911
2927
Ok ( ( ) )
2912
2928
}
2913
2929
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
+
2914
2961
#[ test]
2915
2962
fn scalar_decimal_test ( ) -> Result < ( ) > {
2916
2963
let decimal_value = ScalarValue :: Decimal128 ( Some ( 123 ) , 10 , 1 ) ;
0 commit comments