This is an automated email from the ASF dual-hosted git repository.

fokko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git


The following commit(s) were added to refs/heads/main by this push:
     new c722cecc fix: transform return type for year and month should be int 
(#776)
c722cecc is described below

commit c722cecc0a72608c9e23a3a2c02bcd20f19b9335
Author: xxchan <[email protected]>
AuthorDate: Fri Dec 13 15:04:30 2024 +0800

    fix: transform return type for year and month should be int (#776)
    
    Signed-off-by: xxchan <[email protected]>
---
 crates/iceberg/src/spec/transform.rs     | 22 +++++++++++++++++++++-
 crates/iceberg/src/transform/mod.rs      | 10 ++++++++--
 crates/iceberg/src/transform/temporal.rs | 20 ++++++++++----------
 3 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/crates/iceberg/src/spec/transform.rs 
b/crates/iceberg/src/spec/transform.rs
index 6b7d03f1..29401f17 100644
--- a/crates/iceberg/src/spec/transform.rs
+++ b/crates/iceberg/src/spec/transform.rs
@@ -197,7 +197,27 @@ impl Transform {
                     ))
                 }
             }
-            Transform::Year | Transform::Month | Transform::Day => {
+            Transform::Year | Transform::Month => {
+                if let Type::Primitive(p) = input_type {
+                    match p {
+                        PrimitiveType::Timestamp
+                        | PrimitiveType::Timestamptz
+                        | PrimitiveType::TimestampNs
+                        | PrimitiveType::TimestamptzNs
+                        | PrimitiveType::Date => 
Ok(Type::Primitive(PrimitiveType::Int)),
+                        _ => Err(Error::new(
+                            ErrorKind::DataInvalid,
+                            format!("{input_type} is not a valid input type of 
{self} transform",),
+                        )),
+                    }
+                } else {
+                    Err(Error::new(
+                        ErrorKind::DataInvalid,
+                        format!("{input_type} is not a valid input type of 
{self} transform",),
+                    ))
+                }
+            }
+            Transform::Day => {
                 if let Type::Primitive(p) = input_type {
                     match p {
                         PrimitiveType::Timestamp
diff --git a/crates/iceberg/src/transform/mod.rs 
b/crates/iceberg/src/transform/mod.rs
index 81449da5..509ba6be 100644
--- a/crates/iceberg/src/transform/mod.rs
+++ b/crates/iceberg/src/transform/mod.rs
@@ -157,6 +157,7 @@ mod test {
     }
 
     impl TestTransformFixture {
+        #[track_caller]
         pub(crate) fn assert_transform(&self, trans: Transform) {
             assert_eq!(self.display, format!("{trans}"));
             assert_eq!(self.json, serde_json::to_string(&trans).unwrap());
@@ -175,8 +176,13 @@ mod test {
                 );
             }
 
-            for (input_type, result_type) in &self.trans_types {
-                assert_eq!(result_type, &trans.result_type(input_type).ok());
+            for (i, (input_type, result_type)) in 
self.trans_types.iter().enumerate() {
+                let actual = trans.result_type(input_type).ok();
+                assert_eq!(
+                    result_type, &actual,
+                    "type mismatch at index {}, input: {}, expected: {:?}, 
actual: {:?}",
+                    i, input_type, result_type, actual
+                );
             }
         }
     }
diff --git a/crates/iceberg/src/transform/temporal.rs 
b/crates/iceberg/src/transform/temporal.rs
index f326cfed..c5721dad 100644
--- a/crates/iceberg/src/transform/temporal.rs
+++ b/crates/iceberg/src/transform/temporal.rs
@@ -428,7 +428,7 @@ mod test {
             ],
             trans_types: vec![
                 (Primitive(Binary), None),
-                (Primitive(Date), Some(Primitive(Date))),
+                (Primitive(Date), Some(Primitive(Int))),
                 (
                     Primitive(Decimal {
                         precision: 8,
@@ -442,10 +442,10 @@ mod test {
                 (Primitive(StringType), None),
                 (Primitive(Uuid), None),
                 (Primitive(Time), None),
-                (Primitive(Timestamp), Some(Primitive(Date))),
-                (Primitive(Timestamptz), Some(Primitive(Date))),
-                (Primitive(TimestampNs), Some(Primitive(Date))),
-                (Primitive(TimestamptzNs), Some(Primitive(Date))),
+                (Primitive(Timestamp), Some(Primitive(Int))),
+                (Primitive(Timestamptz), Some(Primitive(Int))),
+                (Primitive(TimestampNs), Some(Primitive(Int))),
+                (Primitive(TimestamptzNs), Some(Primitive(Int))),
                 (
                     Struct(StructType::new(vec![NestedField::optional(
                         1,
@@ -480,7 +480,7 @@ mod test {
             ],
             trans_types: vec![
                 (Primitive(Binary), None),
-                (Primitive(Date), Some(Primitive(Date))),
+                (Primitive(Date), Some(Primitive(Int))),
                 (
                     Primitive(Decimal {
                         precision: 8,
@@ -494,10 +494,10 @@ mod test {
                 (Primitive(StringType), None),
                 (Primitive(Uuid), None),
                 (Primitive(Time), None),
-                (Primitive(Timestamp), Some(Primitive(Date))),
-                (Primitive(Timestamptz), Some(Primitive(Date))),
-                (Primitive(TimestampNs), Some(Primitive(Date))),
-                (Primitive(TimestamptzNs), Some(Primitive(Date))),
+                (Primitive(Timestamp), Some(Primitive(Int))),
+                (Primitive(Timestamptz), Some(Primitive(Int))),
+                (Primitive(TimestampNs), Some(Primitive(Int))),
+                (Primitive(TimestamptzNs), Some(Primitive(Int))),
                 (
                     Struct(StructType::new(vec![NestedField::optional(
                         1,

Reply via email to