mattfaltyn opened a new issue, #3025:
URL: https://github.com/apache/iceberg-rust/issues/3025

   ### Apache Iceberg Rust version
   
   `main` at `7d2dfce494c94e75f726fe52c6c96272b6cc5b32` and `v0.10.1`.
   
   ### Describe the bug
   
   The Arrow implementation of the `hour` partition transform rejects 
nanosecond timestamp arrays, even though `Transform::Hour::result_type` accepts 
`timestamp_ns` and `timestamptz_ns`, and the literal implementation handles 
both types.
   
   This reaches production write paths through `PartitionValueCalculator`: 
calculating partitions for a table with an `hour(event_time)` partition field 
fails when `event_time` is an Arrow `Timestamp(Nanosecond, ...)` column.
   
   The transform currently handles only `TimestampMicrosecondArray` in 
`Hour::transform`. The existing `hour_timestamp_nano` helper is already used by 
`transform_literal`, so the array behavior is inconsistent with the public type 
contract and literal behavior.
   
   ### To reproduce
   
   ```rust
   use std::sync::Arc;
   
   use arrow_array::{RecordBatch, TimestampNanosecondArray};
   use iceberg::arrow::{PartitionValueCalculator, schema_to_arrow_schema};
   use iceberg::spec::{NestedField, PartitionSpec, PrimitiveType, Schema, 
Transform, Type};
   
   let table_schema = Arc::new(
       Schema::builder()
           .with_fields(vec![NestedField::required(
               1,
               "event_time",
               Type::Primitive(PrimitiveType::TimestampNs),
           )
           .into()])
           .build()?,
   );
   let partition_spec = PartitionSpec::builder(table_schema.clone())
       .add_partition_field("event_time", "event_hour", Transform::Hour)?
       .build()?;
   let calculator = PartitionValueCalculator::try_new(&partition_spec, 
&table_schema)?;
   let batch = RecordBatch::try_new(
       Arc::new(schema_to_arrow_schema(&table_schema)?),
       vec![Arc::new(TimestampNanosecondArray::from(vec![
           0,
           3_600_000_000_000,
       ]))],
   )?;
   
   calculator.calculate(&batch)?;
   ```
   
   Actual result:
   
   ```text
   FeatureUnsupported => Unsupported data type for hour transform: 
Timestamp(Nanosecond, None)
   ```
   
   The equivalent microsecond Arrow array succeeds and produces `[0, 1]`.
   
   ### Expected behavior
   
   The nanosecond array should produce hour partition values `[0, 1]`, matching 
the equivalent microsecond array and the supported `timestamp_ns` literal 
transform.
   
   ### Willingness to contribute
   
   I can contribute a focused fix and regression test independently.
   
   ### AI disclosure
   
   Codex assisted with repository inspection, duplicate-history searches, 
reproduction scaffolding, and drafting this report. I reproduced the failure 
against a clean checkout of current upstream and reviewed the relevant 
transform and partition-calculation paths.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to