From c9bc5b4dece1102e8929daf5aed1359ba8b72e38 Mon Sep 17 00:00:00 2001 From: Vaibhav Date: Wed, 8 Jul 2026 21:47:54 +0530 Subject: [PATCH 1/3] remove duplicate iterations --- crates/catalog/glue/src/schema.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/crates/catalog/glue/src/schema.rs b/crates/catalog/glue/src/schema.rs index 864320dae4..607d5b4b08 100644 --- a/crates/catalog/glue/src/schema.rs +++ b/crates/catalog/glue/src/schema.rs @@ -52,15 +52,6 @@ impl GlueSchemaBuilder { visit_schema(current_schema, &mut builder)?; - builder.is_current = false; - - for schema in metadata.schemas_iter() { - if schema.schema_id() == current_schema.schema_id() { - continue; - } - - visit_schema(schema, &mut builder)?; - } Ok(builder) } From 37c85ca732d3697b6dd219e7330c64ccdbe607eb Mon Sep 17 00:00:00 2001 From: Vaibhav Date: Wed, 8 Jul 2026 21:49:44 +0530 Subject: [PATCH 2/3] return builder as false: --- crates/catalog/glue/src/schema.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/catalog/glue/src/schema.rs b/crates/catalog/glue/src/schema.rs index 607d5b4b08..db517d5311 100644 --- a/crates/catalog/glue/src/schema.rs +++ b/crates/catalog/glue/src/schema.rs @@ -52,6 +52,8 @@ impl GlueSchemaBuilder { visit_schema(current_schema, &mut builder)?; + builder.is_current = false; + Ok(builder) } From 38b07ff898e9c9ceaf883e4b394ddf46463cb47b Mon Sep 17 00:00:00 2001 From: Vaibhav Date: Wed, 8 Jul 2026 22:03:18 +0530 Subject: [PATCH 3/3] added tests --- crates/catalog/glue/src/schema.rs | 74 ++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/crates/catalog/glue/src/schema.rs b/crates/catalog/glue/src/schema.rs index db517d5311..149d1b43b0 100644 --- a/crates/catalog/glue/src/schema.rs +++ b/crates/catalog/glue/src/schema.rs @@ -52,9 +52,9 @@ impl GlueSchemaBuilder { visit_schema(current_schema, &mut builder)?; + // Keeping the returned builder state unchanged for compatibility with callers that may inspect it before calling `build`. builder.is_current = false; - Ok(builder) } @@ -331,6 +331,78 @@ mod tests { Ok(()) } + #[test] + fn test_schema_evolution_only_converts_current_schema_fields() -> Result<()> { + let initial_schema = serde_json::from_str::( + r#"{ + "type": "struct", + "schema-id": 1, + "fields": [ + { + "id": 1, + "name": "id", + "required": true, + "type": "long" + }, + { + "id": 2, + "name": "name", + "required": false, + "type": "string" + } + ] + }"#, + )?; + let metadata = create_metadata(initial_schema)?; + + let evolved_schema = serde_json::from_str::( + r#"{ + "type": "struct", + "schema-id": 2, + "fields": [ + { + "id": 1, + "name": "id", + "required": true, + "type": "long" + }, + { + "id": 2, + "name": "name", + "required": false, + "type": "string" + }, + { + "id": 3, + "name": "age", + "required": false, + "type": "int" + } + ] + }"#, + )?; + + let metadata = TableMetadataBuilder::new_from_metadata(metadata, None) + .add_schema(evolved_schema)? + .set_current_schema(TableMetadataBuilder::LAST_ADDED)? + .build()? + .metadata; + + assert_eq!(metadata.schemas_iter().len(), 2); + + let result = GlueSchemaBuilder::from_iceberg(&metadata)?.build(); + + let expected = vec![ + create_column("id", "bigint", "1", false)?, + create_column("name", "string", "2", true)?, + create_column("age", "int", "3", true)?, + ]; + + assert_eq!(result, expected); + + Ok(()) + } + #[test] fn test_schema_with_structs() -> Result<()> { let record = r#"{