@@ -1199,11 +1199,57 @@ impl Datum {
1199
1199
( PrimitiveLiteral :: Long ( val) , _, PrimitiveType :: Int ) => {
1200
1200
Ok ( Datum :: i64_to_i32 ( * val) )
1201
1201
}
1202
- ( PrimitiveLiteral :: Long ( val) , _, PrimitiveType :: Timestamp ) => {
1203
- Ok ( Datum :: timestamp_micros ( * val) )
1204
- }
1205
- ( PrimitiveLiteral :: Long ( val) , _, PrimitiveType :: Timestamptz ) => {
1206
- Ok ( Datum :: timestamptz_micros ( * val) )
1202
+ ( PrimitiveLiteral :: Long ( val) , source_type, target_type) => {
1203
+ match ( source_type, target_type) {
1204
+ ( _, PrimitiveType :: Long ) => Ok ( Datum :: long ( * val) ) ,
1205
+ (
1206
+ PrimitiveType :: Long
1207
+ | PrimitiveType :: Timestamp
1208
+ | PrimitiveType :: Timestamptz ,
1209
+ PrimitiveType :: Timestamp ,
1210
+ ) => Ok ( Datum :: timestamp_micros ( * val) ) ,
1211
+ (
1212
+ PrimitiveType :: Long
1213
+ | PrimitiveType :: Timestamp
1214
+ | PrimitiveType :: Timestamptz ,
1215
+ PrimitiveType :: Timestamptz ,
1216
+ ) => Ok ( Datum :: timestamptz_micros ( * val) ) ,
1217
+ (
1218
+ PrimitiveType :: Long
1219
+ | PrimitiveType :: TimestampNs
1220
+ | PrimitiveType :: TimestamptzNs ,
1221
+ PrimitiveType :: TimestampNs ,
1222
+ ) => Ok ( Datum :: timestamp_nanos ( * val) ) ,
1223
+ (
1224
+ PrimitiveType :: Long
1225
+ | PrimitiveType :: TimestampNs
1226
+ | PrimitiveType :: TimestamptzNs ,
1227
+ PrimitiveType :: TimestamptzNs ,
1228
+ ) => Ok ( Datum :: timestamptz_nanos ( * val) ) ,
1229
+ (
1230
+ PrimitiveType :: TimestampNs | PrimitiveType :: TimestamptzNs ,
1231
+ PrimitiveType :: Timestamp ,
1232
+ ) => Ok ( Datum :: timestamp_micros ( val / 1000 ) ) ,
1233
+ (
1234
+ PrimitiveType :: TimestampNs | PrimitiveType :: TimestamptzNs ,
1235
+ PrimitiveType :: Timestamptz ,
1236
+ ) => Ok ( Datum :: timestamptz_micros ( val / 1000 ) ) ,
1237
+ (
1238
+ PrimitiveType :: Timestamp | PrimitiveType :: Timestamptz ,
1239
+ PrimitiveType :: TimestampNs ,
1240
+ ) => Ok ( Datum :: timestamp_nanos ( val * 1000 ) ) ,
1241
+ (
1242
+ PrimitiveType :: Timestamp | PrimitiveType :: Timestamptz ,
1243
+ PrimitiveType :: TimestamptzNs ,
1244
+ ) => Ok ( Datum :: timestamptz_nanos ( val * 1000 ) ) ,
1245
+ _ => Err ( Error :: new (
1246
+ ErrorKind :: DataInvalid ,
1247
+ format ! (
1248
+ "Can't convert datum from {} type to {} type." ,
1249
+ self . r#type, target_primitive_type
1250
+ ) ,
1251
+ ) ) ,
1252
+ }
1207
1253
}
1208
1254
// Let's wait with nano's until this clears up: https://github.com/apache/iceberg/pull/11775
1209
1255
( PrimitiveLiteral :: Int128 ( val) , _, PrimitiveType :: Long ) => {
@@ -3943,4 +3989,181 @@ mod tests {
3943
3989
3944
3990
assert_eq ! ( double_sorted, double_expected) ;
3945
3991
}
3992
+
3993
+ // Tests for timestamp nanosecond conversions
3994
+ #[ test]
3995
+ fn test_datum_timestamp_nanos_convert_to_timestamp_micros ( ) {
3996
+ let datum = Datum :: timestamp_nanos ( 12345000 ) ;
3997
+
3998
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
3999
+
4000
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4001
+
4002
+ assert_eq ! ( result, expected) ;
4003
+ }
4004
+
4005
+ #[ test]
4006
+ fn test_datum_timestamp_nanos_convert_to_timestamptz_micros ( ) {
4007
+ let datum = Datum :: timestamp_nanos ( 12345000 ) ;
4008
+
4009
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamptz ) ) . unwrap ( ) ;
4010
+
4011
+ let expected = Datum :: timestamptz_micros ( 12345 ) ;
4012
+
4013
+ assert_eq ! ( result, expected) ;
4014
+ }
4015
+
4016
+ #[ test]
4017
+ fn test_datum_timestamptz_nanos_convert_to_timestamp_micros ( ) {
4018
+ let datum = Datum :: timestamptz_nanos ( 12345000 ) ;
4019
+
4020
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
4021
+
4022
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4023
+
4024
+ assert_eq ! ( result, expected) ;
4025
+ }
4026
+
4027
+ #[ test]
4028
+ fn test_datum_timestamptz_nanos_convert_to_timestamptz_micros ( ) {
4029
+ let datum = Datum :: timestamptz_nanos ( 12345000 ) ;
4030
+
4031
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamptz ) ) . unwrap ( ) ;
4032
+
4033
+ let expected = Datum :: timestamptz_micros ( 12345 ) ;
4034
+
4035
+ assert_eq ! ( result, expected) ;
4036
+ }
4037
+
4038
+ #[ test]
4039
+ fn test_datum_timestamp_micros_convert_to_timestamp_nanos ( ) {
4040
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4041
+
4042
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4043
+
4044
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4045
+
4046
+ assert_eq ! ( result, expected) ;
4047
+ }
4048
+
4049
+ #[ test]
4050
+ fn test_datum_timestamp_micros_convert_to_timestamptz_nanos ( ) {
4051
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4052
+
4053
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4054
+
4055
+ let expected = Datum :: timestamptz_nanos ( 12345000 ) ;
4056
+
4057
+ assert_eq ! ( result, expected) ;
4058
+ }
4059
+
4060
+ #[ test]
4061
+ fn test_datum_timestamptz_micros_convert_to_timestamp_nanos ( ) {
4062
+ let datum = Datum :: timestamptz_micros ( 12345 ) ;
4063
+
4064
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4065
+
4066
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4067
+
4068
+ assert_eq ! ( result, expected) ;
4069
+ }
4070
+
4071
+ #[ test]
4072
+ fn test_datum_timestamptz_micros_convert_to_timestamptz_nanos ( ) {
4073
+ let datum = Datum :: timestamptz_micros ( 12345 ) ;
4074
+
4075
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4076
+
4077
+ let expected = Datum :: timestamptz_nanos ( 12345000 ) ;
4078
+
4079
+ assert_eq ! ( result, expected) ;
4080
+ }
4081
+
4082
+ #[ test]
4083
+ fn test_datum_timestamp_nanos_convert_to_timestamp_nanos ( ) {
4084
+ let datum = Datum :: timestamp_nanos ( 12345 ) ;
4085
+
4086
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4087
+
4088
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4089
+
4090
+ assert_eq ! ( result, expected) ;
4091
+ }
4092
+
4093
+ #[ test]
4094
+ fn test_datum_timestamp_nanos_convert_to_timestamptz_nanos ( ) {
4095
+ let datum = Datum :: timestamp_nanos ( 12345 ) ;
4096
+
4097
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4098
+
4099
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4100
+
4101
+ assert_eq ! ( result, expected) ;
4102
+ }
4103
+
4104
+ #[ test]
4105
+ fn test_datum_timestamptz_nanos_convert_to_timestamp_nanos ( ) {
4106
+ let datum = Datum :: timestamptz_nanos ( 12345 ) ;
4107
+
4108
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4109
+
4110
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4111
+
4112
+ assert_eq ! ( result, expected) ;
4113
+ }
4114
+
4115
+ #[ test]
4116
+ fn test_datum_timestamptz_nanos_convert_to_timestamptz_nanos ( ) {
4117
+ let datum = Datum :: timestamptz_nanos ( 12345 ) ;
4118
+
4119
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4120
+
4121
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4122
+
4123
+ assert_eq ! ( result, expected) ;
4124
+ }
4125
+
4126
+ #[ test]
4127
+ fn test_datum_long_convert_to_timestamp_nanos ( ) {
4128
+ let datum = Datum :: long ( 12345 ) ;
4129
+
4130
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4131
+
4132
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4133
+
4134
+ assert_eq ! ( result, expected) ;
4135
+ }
4136
+
4137
+ #[ test]
4138
+ fn test_datum_long_convert_to_timestamptz_nanos ( ) {
4139
+ let datum = Datum :: long ( 12345 ) ;
4140
+
4141
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4142
+
4143
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4144
+
4145
+ assert_eq ! ( result, expected) ;
4146
+ }
4147
+
4148
+ #[ test]
4149
+ fn test_datum_timestamp_nanos_to_micros ( ) {
4150
+ let datum = Datum :: timestamp_nanos ( 12345678 ) ;
4151
+
4152
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
4153
+
4154
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4155
+
4156
+ assert_eq ! ( result, expected) ;
4157
+ }
4158
+
4159
+ #[ test]
4160
+ fn test_datum_timestamp_micros_to_nanos ( ) {
4161
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4162
+
4163
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4164
+
4165
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4166
+
4167
+ assert_eq ! ( result, expected) ;
4168
+ }
3946
4169
}
0 commit comments