@@ -5756,25 +5756,11 @@ mod tests {
5756
5756
}
5757
5757
}
5758
5758
5759
- #[ test]
5760
- fn timestamp_op_tests ( ) {
5761
- // positive interval, edge cases
5762
- let test_data = get_timestamp_test_data ( 1 ) ;
5763
- for ( lhs, rhs, expected) in test_data. into_iter ( ) {
5764
- assert_eq ! ( expected, lhs. sub( rhs) . unwrap( ) )
5765
- }
5766
-
5767
- // negative interval, edge cases
5768
- let test_data = get_timestamp_test_data ( -1 ) ;
5769
- for ( rhs, lhs, expected) in test_data. into_iter ( ) {
5770
- assert_eq ! ( expected, lhs. sub( rhs) . unwrap( ) ) ;
5771
- }
5772
- }
5773
5759
#[ test]
5774
5760
fn timestamp_op_random_tests ( ) {
5775
5761
// timestamp1 + (or -) interval = timestamp2
5776
5762
// timestamp2 - timestamp1 (or timestamp1 - timestamp2) = interval ?
5777
- let sample_size = 1000000 ;
5763
+ let sample_size = 1000 ;
5778
5764
let timestamps1 = get_random_timestamps ( sample_size) ;
5779
5765
let intervals = get_random_intervals ( sample_size) ;
5780
5766
// ts(sec) + interval(ns) = ts(sec); however,
@@ -5783,18 +5769,12 @@ mod tests {
5783
5769
for ( idx, ts1) in timestamps1. iter ( ) . enumerate ( ) {
5784
5770
if idx % 2 == 0 {
5785
5771
let timestamp2 = ts1. add ( intervals[ idx] . clone ( ) ) . unwrap ( ) ;
5786
- assert_eq ! (
5787
- intervals[ idx] ,
5788
- timestamp2. sub( ts1) . unwrap( ) ,
5789
- "index:{idx}, operands: {timestamp2:?} (-) {ts1:?}"
5790
- ) ;
5772
+ let back = timestamp2. sub ( intervals[ idx] . clone ( ) ) . unwrap ( ) ;
5773
+ assert_eq ! ( ts1, & back) ;
5791
5774
} else {
5792
5775
let timestamp2 = ts1. sub ( intervals[ idx] . clone ( ) ) . unwrap ( ) ;
5793
- assert_eq ! (
5794
- intervals[ idx] ,
5795
- ts1. sub( timestamp2. clone( ) ) . unwrap( ) ,
5796
- "index:{idx}, operands: {ts1:?} (-) {timestamp2:?}"
5797
- ) ;
5776
+ let back = timestamp2. add ( intervals[ idx] . clone ( ) ) . unwrap ( ) ;
5777
+ assert_eq ! ( ts1, & back) ;
5798
5778
} ;
5799
5779
}
5800
5780
}
@@ -5879,285 +5859,6 @@ mod tests {
5879
5859
check_array ( array) ;
5880
5860
}
5881
5861
5882
- fn get_timestamp_test_data (
5883
- sign : i32 ,
5884
- ) -> Vec < ( ScalarValue , ScalarValue , ScalarValue ) > {
5885
- vec ! [
5886
- (
5887
- // 1st test case, having the same time but different with timezones
5888
- // Since they are timestamps with nanosecond precision, expected type is
5889
- // [`IntervalMonthDayNanoType`]
5890
- ScalarValue :: TimestampNanosecond (
5891
- Some (
5892
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
5893
- . unwrap( )
5894
- . and_hms_nano_opt( 12 , 0 , 0 , 000_000_000 )
5895
- . unwrap( )
5896
- . timestamp_nanos( ) ,
5897
- ) ,
5898
- Some ( "+12:00" . into( ) ) ,
5899
- ) ,
5900
- ScalarValue :: TimestampNanosecond (
5901
- Some (
5902
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
5903
- . unwrap( )
5904
- . and_hms_nano_opt( 0 , 0 , 0 , 000_000_000 )
5905
- . unwrap( )
5906
- . timestamp_nanos( ) ,
5907
- ) ,
5908
- Some ( "+00:00" . into( ) ) ,
5909
- ) ,
5910
- ScalarValue :: new_interval_mdn( 0 , 0 , 0 ) ,
5911
- ) ,
5912
- // 2nd test case, january with 31 days plus february with 28 days, with timezone
5913
- (
5914
- ScalarValue :: TimestampMicrosecond (
5915
- Some (
5916
- NaiveDate :: from_ymd_opt( 2023 , 3 , 1 )
5917
- . unwrap( )
5918
- . and_hms_micro_opt( 2 , 0 , 0 , 000_000 )
5919
- . unwrap( )
5920
- . timestamp_micros( ) ,
5921
- ) ,
5922
- Some ( "+01:00" . into( ) ) ,
5923
- ) ,
5924
- ScalarValue :: TimestampMicrosecond (
5925
- Some (
5926
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
5927
- . unwrap( )
5928
- . and_hms_micro_opt( 0 , 0 , 0 , 000_000 )
5929
- . unwrap( )
5930
- . timestamp_micros( ) ,
5931
- ) ,
5932
- Some ( "-01:00" . into( ) ) ,
5933
- ) ,
5934
- ScalarValue :: new_interval_mdn( 0 , sign * 59 , 0 ) ,
5935
- ) ,
5936
- // 3rd test case, 29-days long february minus previous, year with timezone
5937
- (
5938
- ScalarValue :: TimestampMillisecond (
5939
- Some (
5940
- NaiveDate :: from_ymd_opt( 2024 , 2 , 29 )
5941
- . unwrap( )
5942
- . and_hms_milli_opt( 10 , 10 , 0 , 000 )
5943
- . unwrap( )
5944
- . timestamp_millis( ) ,
5945
- ) ,
5946
- Some ( "+10:10" . into( ) ) ,
5947
- ) ,
5948
- ScalarValue :: TimestampMillisecond (
5949
- Some (
5950
- NaiveDate :: from_ymd_opt( 2023 , 12 , 31 )
5951
- . unwrap( )
5952
- . and_hms_milli_opt( 1 , 0 , 0 , 000 )
5953
- . unwrap( )
5954
- . timestamp_millis( ) ,
5955
- ) ,
5956
- Some ( "+01:00" . into( ) ) ,
5957
- ) ,
5958
- ScalarValue :: new_interval_dt( sign * 60 , 0 ) ,
5959
- ) ,
5960
- // 4th test case, leap years occur mostly every 4 years, but every 100 years
5961
- // we skip a leap year unless the year is divisible by 400, so 31 + 28 = 59
5962
- (
5963
- ScalarValue :: TimestampSecond (
5964
- Some (
5965
- NaiveDate :: from_ymd_opt( 2100 , 3 , 1 )
5966
- . unwrap( )
5967
- . and_hms_opt( 0 , 0 , 0 )
5968
- . unwrap( )
5969
- . timestamp( ) ,
5970
- ) ,
5971
- Some ( "-11:59" . into( ) ) ,
5972
- ) ,
5973
- ScalarValue :: TimestampSecond (
5974
- Some (
5975
- NaiveDate :: from_ymd_opt( 2100 , 1 , 1 )
5976
- . unwrap( )
5977
- . and_hms_opt( 23 , 58 , 0 )
5978
- . unwrap( )
5979
- . timestamp( ) ,
5980
- ) ,
5981
- Some ( "+11:59" . into( ) ) ,
5982
- ) ,
5983
- ScalarValue :: new_interval_dt( sign * 59 , 0 ) ,
5984
- ) ,
5985
- // 5th test case, without timezone positively seemed, but with timezone,
5986
- // negative resulting interval
5987
- (
5988
- ScalarValue :: TimestampMillisecond (
5989
- Some (
5990
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
5991
- . unwrap( )
5992
- . and_hms_milli_opt( 6 , 00 , 0 , 000 )
5993
- . unwrap( )
5994
- . timestamp_millis( ) ,
5995
- ) ,
5996
- Some ( "+06:00" . into( ) ) ,
5997
- ) ,
5998
- ScalarValue :: TimestampMillisecond (
5999
- Some (
6000
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
6001
- . unwrap( )
6002
- . and_hms_milli_opt( 0 , 0 , 0 , 000 )
6003
- . unwrap( )
6004
- . timestamp_millis( ) ,
6005
- ) ,
6006
- Some ( "-12:00" . into( ) ) ,
6007
- ) ,
6008
- ScalarValue :: new_interval_dt( 0 , sign * -43_200_000 ) ,
6009
- ) ,
6010
- // 6th test case, no problem before unix epoch beginning
6011
- (
6012
- ScalarValue :: TimestampMicrosecond (
6013
- Some (
6014
- NaiveDate :: from_ymd_opt( 1970 , 1 , 1 )
6015
- . unwrap( )
6016
- . and_hms_micro_opt( 1 , 2 , 3 , 15 )
6017
- . unwrap( )
6018
- . timestamp_micros( ) ,
6019
- ) ,
6020
- None ,
6021
- ) ,
6022
- ScalarValue :: TimestampMicrosecond (
6023
- Some (
6024
- NaiveDate :: from_ymd_opt( 1969 , 1 , 1 )
6025
- . unwrap( )
6026
- . and_hms_micro_opt( 0 , 0 , 0 , 000_000 )
6027
- . unwrap( )
6028
- . timestamp_micros( ) ,
6029
- ) ,
6030
- None ,
6031
- ) ,
6032
- ScalarValue :: new_interval_mdn(
6033
- 0 ,
6034
- 365 * sign,
6035
- sign as i64 * 3_723_000_015_000 ,
6036
- ) ,
6037
- ) ,
6038
- // 7th test case, no problem with big intervals
6039
- (
6040
- ScalarValue :: TimestampNanosecond (
6041
- Some (
6042
- NaiveDate :: from_ymd_opt( 2100 , 1 , 1 )
6043
- . unwrap( )
6044
- . and_hms_nano_opt( 0 , 0 , 0 , 0 )
6045
- . unwrap( )
6046
- . timestamp_nanos( ) ,
6047
- ) ,
6048
- None ,
6049
- ) ,
6050
- ScalarValue :: TimestampNanosecond (
6051
- Some (
6052
- NaiveDate :: from_ymd_opt( 2000 , 1 , 1 )
6053
- . unwrap( )
6054
- . and_hms_nano_opt( 0 , 0 , 0 , 000_000_000 )
6055
- . unwrap( )
6056
- . timestamp_nanos( ) ,
6057
- ) ,
6058
- None ,
6059
- ) ,
6060
- ScalarValue :: new_interval_mdn( 0 , sign * 36525 , 0 ) ,
6061
- ) ,
6062
- // 8th test case, no problem detecting 366-days long years
6063
- (
6064
- ScalarValue :: TimestampSecond (
6065
- Some (
6066
- NaiveDate :: from_ymd_opt( 2041 , 1 , 1 )
6067
- . unwrap( )
6068
- . and_hms_opt( 0 , 0 , 0 )
6069
- . unwrap( )
6070
- . timestamp( ) ,
6071
- ) ,
6072
- None ,
6073
- ) ,
6074
- ScalarValue :: TimestampSecond (
6075
- Some (
6076
- NaiveDate :: from_ymd_opt( 2040 , 1 , 1 )
6077
- . unwrap( )
6078
- . and_hms_opt( 0 , 0 , 0 )
6079
- . unwrap( )
6080
- . timestamp( ) ,
6081
- ) ,
6082
- None ,
6083
- ) ,
6084
- ScalarValue :: new_interval_dt( sign * 366 , 0 ) ,
6085
- ) ,
6086
- // 9th test case, no problem with unrealistic timezones
6087
- (
6088
- ScalarValue :: TimestampSecond (
6089
- Some (
6090
- NaiveDate :: from_ymd_opt( 2023 , 1 , 3 )
6091
- . unwrap( )
6092
- . and_hms_opt( 0 , 0 , 0 )
6093
- . unwrap( )
6094
- . timestamp( ) ,
6095
- ) ,
6096
- Some ( "+23:59" . into( ) ) ,
6097
- ) ,
6098
- ScalarValue :: TimestampSecond (
6099
- Some (
6100
- NaiveDate :: from_ymd_opt( 2023 , 1 , 1 )
6101
- . unwrap( )
6102
- . and_hms_opt( 0 , 2 , 0 )
6103
- . unwrap( )
6104
- . timestamp( ) ,
6105
- ) ,
6106
- Some ( "-23:59" . into( ) ) ,
6107
- ) ,
6108
- ScalarValue :: new_interval_dt( 0 , 0 ) ,
6109
- ) ,
6110
- // 10th test case, parsing different types of timezone input
6111
- (
6112
- ScalarValue :: TimestampSecond (
6113
- Some (
6114
- NaiveDate :: from_ymd_opt( 2023 , 3 , 17 )
6115
- . unwrap( )
6116
- . and_hms_opt( 14 , 10 , 0 )
6117
- . unwrap( )
6118
- . timestamp( ) ,
6119
- ) ,
6120
- Some ( "Europe/Istanbul" . into( ) ) ,
6121
- ) ,
6122
- ScalarValue :: TimestampSecond (
6123
- Some (
6124
- NaiveDate :: from_ymd_opt( 2023 , 3 , 17 )
6125
- . unwrap( )
6126
- . and_hms_opt( 4 , 10 , 0 )
6127
- . unwrap( )
6128
- . timestamp( ) ,
6129
- ) ,
6130
- Some ( "America/Los_Angeles" . into( ) ) ,
6131
- ) ,
6132
- ScalarValue :: new_interval_dt( 0 , 0 ) ,
6133
- ) ,
6134
- // 11th test case, negative results
6135
- (
6136
- ScalarValue :: TimestampMillisecond (
6137
- Some (
6138
- NaiveDate :: from_ymd_opt( 2023 , 3 , 17 )
6139
- . unwrap( )
6140
- . and_hms_milli_opt( 4 , 10 , 0 , 0 )
6141
- . unwrap( )
6142
- . timestamp_millis( ) ,
6143
- ) ,
6144
- None ,
6145
- ) ,
6146
- ScalarValue :: TimestampMillisecond (
6147
- Some (
6148
- NaiveDate :: from_ymd_opt( 2023 , 3 , 17 )
6149
- . unwrap( )
6150
- . and_hms_milli_opt( 4 , 10 , 0 , 1 )
6151
- . unwrap( )
6152
- . timestamp_millis( ) ,
6153
- ) ,
6154
- None ,
6155
- ) ,
6156
- ScalarValue :: new_interval_dt( 0 , -sign) ,
6157
- ) ,
6158
- ]
6159
- }
6160
-
6161
5862
fn get_random_timestamps ( sample_size : u64 ) -> Vec < ScalarValue > {
6162
5863
let vector_size = sample_size;
6163
5864
let mut timestamp = vec ! [ ] ;
0 commit comments