From 3499e4bb4867b75ef5ece4d0da41f75d16d4aaa4 Mon Sep 17 00:00:00 2001 From: Sreeram Garlapati Date: Fri, 29 May 2026 20:33:27 -0700 Subject: [PATCH] fix: add space after comma in decimal type serialization for spec compliance The Iceberg spec, Java, and Python all serialize the decimal type as `decimal(P, S)` (with a space after the comma). iceberg-rust was writing `decimal(P,S)` which could cause metadata written by Rust to be rejected or misinterpreted by strict parsers in other implementations. The deserializer already handles both formats via trim(), so this change is backwards-compatible for reading. Closes #2534 Co-authored-by: rawataaryan9 --- crates/iceberg/src/spec/datatypes.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/iceberg/src/spec/datatypes.rs b/crates/iceberg/src/spec/datatypes.rs index ad4aea758f..3a112e9f5c 100644 --- a/crates/iceberg/src/spec/datatypes.rs +++ b/crates/iceberg/src/spec/datatypes.rs @@ -340,7 +340,7 @@ fn serialize_decimal( where S: Serializer, { - serializer.serialize_str(&format!("decimal({precision},{scale})")) + serializer.serialize_str(&format!("decimal({precision}, {scale})")) } fn deserialize_fixed<'de, D>(deserializer: D) -> std::result::Result @@ -370,7 +370,7 @@ impl fmt::Display for PrimitiveType { PrimitiveType::Float => write!(f, "float"), PrimitiveType::Double => write!(f, "double"), PrimitiveType::Decimal { precision, scale } => { - write!(f, "decimal({precision},{scale})") + write!(f, "decimal({precision}, {scale})") } PrimitiveType::Date => write!(f, "date"), PrimitiveType::Time => write!(f, "time"), @@ -874,7 +874,7 @@ mod tests { {"id": 3, "name": "long_field", "required": true, "type": "long"}, {"id": 4, "name": "float_field", "required": true, "type": "float"}, {"id": 5, "name": "double_field", "required": true, "type": "double"}, - {"id": 6, "name": "decimal_field", "required": true, "type": "decimal(9,2)"}, + {"id": 6, "name": "decimal_field", "required": true, "type": "decimal(9, 2)"}, {"id": 7, "name": "date_field", "required": true, "type": "date"}, {"id": 8, "name": "time_field", "required": true, "type": "time"}, {"id": 9, "name": "timestamp_field", "required": true, "type": "timestamp"},