@@ -1199,11 +1199,57 @@ impl Datum {
11991199 ( PrimitiveLiteral :: Long ( val) , _, PrimitiveType :: Int ) => {
12001200 Ok ( Datum :: i64_to_i32 ( * val) )
12011201 }
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+ }
12071253 }
12081254 // Let's wait with nano's until this clears up: https://github.com/apache/iceberg/pull/11775
12091255 ( PrimitiveLiteral :: Int128 ( val) , _, PrimitiveType :: Long ) => {
@@ -3943,4 +3989,181 @@ mod tests {
39433989
39443990 assert_eq ! ( double_sorted, double_expected) ;
39453991 }
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+ }
39464169}
0 commit comments