@@ -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 ) => {
@@ -3954,4 +4000,180 @@ mod tests {
3954
4000
3955
4001
assert_eq ! ( double_sorted, double_expected) ;
3956
4002
}
4003
+
4004
+ #[ test]
4005
+ fn test_datum_timestamp_nanos_convert_to_timestamp_micros ( ) {
4006
+ let datum = Datum :: timestamp_nanos ( 12345000 ) ;
4007
+
4008
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
4009
+
4010
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4011
+
4012
+ assert_eq ! ( result, expected) ;
4013
+ }
4014
+
4015
+ #[ test]
4016
+ fn test_datum_timestamp_nanos_convert_to_timestamptz_micros ( ) {
4017
+ let datum = Datum :: timestamp_nanos ( 12345000 ) ;
4018
+
4019
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamptz ) ) . unwrap ( ) ;
4020
+
4021
+ let expected = Datum :: timestamptz_micros ( 12345 ) ;
4022
+
4023
+ assert_eq ! ( result, expected) ;
4024
+ }
4025
+
4026
+ #[ test]
4027
+ fn test_datum_timestamptz_nanos_convert_to_timestamp_micros ( ) {
4028
+ let datum = Datum :: timestamptz_nanos ( 12345000 ) ;
4029
+
4030
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
4031
+
4032
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4033
+
4034
+ assert_eq ! ( result, expected) ;
4035
+ }
4036
+
4037
+ #[ test]
4038
+ fn test_datum_timestamptz_nanos_convert_to_timestamptz_micros ( ) {
4039
+ let datum = Datum :: timestamptz_nanos ( 12345000 ) ;
4040
+
4041
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamptz ) ) . unwrap ( ) ;
4042
+
4043
+ let expected = Datum :: timestamptz_micros ( 12345 ) ;
4044
+
4045
+ assert_eq ! ( result, expected) ;
4046
+ }
4047
+
4048
+ #[ test]
4049
+ fn test_datum_timestamp_micros_convert_to_timestamp_nanos ( ) {
4050
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4051
+
4052
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4053
+
4054
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4055
+
4056
+ assert_eq ! ( result, expected) ;
4057
+ }
4058
+
4059
+ #[ test]
4060
+ fn test_datum_timestamp_micros_convert_to_timestamptz_nanos ( ) {
4061
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4062
+
4063
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4064
+
4065
+ let expected = Datum :: timestamptz_nanos ( 12345000 ) ;
4066
+
4067
+ assert_eq ! ( result, expected) ;
4068
+ }
4069
+
4070
+ #[ test]
4071
+ fn test_datum_timestamptz_micros_convert_to_timestamp_nanos ( ) {
4072
+ let datum = Datum :: timestamptz_micros ( 12345 ) ;
4073
+
4074
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4075
+
4076
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4077
+
4078
+ assert_eq ! ( result, expected) ;
4079
+ }
4080
+
4081
+ #[ test]
4082
+ fn test_datum_timestamptz_micros_convert_to_timestamptz_nanos ( ) {
4083
+ let datum = Datum :: timestamptz_micros ( 12345 ) ;
4084
+
4085
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4086
+
4087
+ let expected = Datum :: timestamptz_nanos ( 12345000 ) ;
4088
+
4089
+ assert_eq ! ( result, expected) ;
4090
+ }
4091
+
4092
+ #[ test]
4093
+ fn test_datum_timestamp_nanos_convert_to_timestamp_nanos ( ) {
4094
+ let datum = Datum :: timestamp_nanos ( 12345 ) ;
4095
+
4096
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4097
+
4098
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4099
+
4100
+ assert_eq ! ( result, expected) ;
4101
+ }
4102
+
4103
+ #[ test]
4104
+ fn test_datum_timestamp_nanos_convert_to_timestamptz_nanos ( ) {
4105
+ let datum = Datum :: timestamp_nanos ( 12345 ) ;
4106
+
4107
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4108
+
4109
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4110
+
4111
+ assert_eq ! ( result, expected) ;
4112
+ }
4113
+
4114
+ #[ test]
4115
+ fn test_datum_timestamptz_nanos_convert_to_timestamp_nanos ( ) {
4116
+ let datum = Datum :: timestamptz_nanos ( 12345 ) ;
4117
+
4118
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4119
+
4120
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4121
+
4122
+ assert_eq ! ( result, expected) ;
4123
+ }
4124
+
4125
+ #[ test]
4126
+ fn test_datum_timestamptz_nanos_convert_to_timestamptz_nanos ( ) {
4127
+ let datum = Datum :: timestamptz_nanos ( 12345 ) ;
4128
+
4129
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4130
+
4131
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4132
+
4133
+ assert_eq ! ( result, expected) ;
4134
+ }
4135
+
4136
+ #[ test]
4137
+ fn test_datum_long_convert_to_timestamp_nanos ( ) {
4138
+ let datum = Datum :: long ( 12345 ) ;
4139
+
4140
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4141
+
4142
+ let expected = Datum :: timestamp_nanos ( 12345 ) ;
4143
+
4144
+ assert_eq ! ( result, expected) ;
4145
+ }
4146
+
4147
+ #[ test]
4148
+ fn test_datum_long_convert_to_timestamptz_nanos ( ) {
4149
+ let datum = Datum :: long ( 12345 ) ;
4150
+
4151
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestamptzNs ) ) . unwrap ( ) ;
4152
+
4153
+ let expected = Datum :: timestamptz_nanos ( 12345 ) ;
4154
+
4155
+ assert_eq ! ( result, expected) ;
4156
+ }
4157
+
4158
+ #[ test]
4159
+ fn test_datum_timestamp_nanos_to_micros ( ) {
4160
+ let datum = Datum :: timestamp_nanos ( 12345678 ) ;
4161
+
4162
+ let result = datum. to ( & Primitive ( PrimitiveType :: Timestamp ) ) . unwrap ( ) ;
4163
+
4164
+ let expected = Datum :: timestamp_micros ( 12345 ) ;
4165
+
4166
+ assert_eq ! ( result, expected) ;
4167
+ }
4168
+
4169
+ #[ test]
4170
+ fn test_datum_timestamp_micros_to_nanos ( ) {
4171
+ let datum = Datum :: timestamp_micros ( 12345 ) ;
4172
+
4173
+ let result = datum. to ( & Primitive ( PrimitiveType :: TimestampNs ) ) . unwrap ( ) ;
4174
+
4175
+ let expected = Datum :: timestamp_nanos ( 12345000 ) ;
4176
+
4177
+ assert_eq ! ( result, expected) ;
4178
+ }
3957
4179
}
0 commit comments