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

timbrown pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-xtable.git


The following commit(s) were added to refs/heads/main by this push:
     new 8cab6a29 fix(delta): avoid NPE for binary in map/array schemas (#795)
8cab6a29 is described below

commit 8cab6a299b869b644beeb0ced5386627541e9f43
Author: Nicolas Paris <[email protected]>
AuthorDate: Thu Feb 12 05:02:40 2026 +0100

    fix(delta): avoid NPE for binary in map/array schemas (#795)
    
    * fix(delta): avoid NPE for binary in map/array schemas
    
    * add ut
---
 .../apache/xtable/delta/DeltaSchemaExtractor.java  |  3 +-
 .../xtable/delta/TestDeltaSchemaExtractor.java     | 75 ++++++++++++++++++++++
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git 
a/xtable-core/src/main/java/org/apache/xtable/delta/DeltaSchemaExtractor.java 
b/xtable-core/src/main/java/org/apache/xtable/delta/DeltaSchemaExtractor.java
index 5119f5f5..d6e59a97 100644
--- 
a/xtable-core/src/main/java/org/apache/xtable/delta/DeltaSchemaExtractor.java
+++ 
b/xtable-core/src/main/java/org/apache/xtable/delta/DeltaSchemaExtractor.java
@@ -101,7 +101,8 @@ public class DeltaSchemaExtractor {
         type = InternalType.DOUBLE;
         break;
       case "binary":
-        if (originalMetadata.contains(InternalSchema.XTABLE_LOGICAL_TYPE)
+        if (originalMetadata != null
+            && originalMetadata.contains(InternalSchema.XTABLE_LOGICAL_TYPE)
             && 
"uuid".equals(originalMetadata.getString(InternalSchema.XTABLE_LOGICAL_TYPE))) {
           type = InternalType.UUID;
         } else {
diff --git 
a/xtable-core/src/test/java/org/apache/xtable/delta/TestDeltaSchemaExtractor.java
 
b/xtable-core/src/test/java/org/apache/xtable/delta/TestDeltaSchemaExtractor.java
index 81ab34d2..960bc78b 100644
--- 
a/xtable-core/src/test/java/org/apache/xtable/delta/TestDeltaSchemaExtractor.java
+++ 
b/xtable-core/src/test/java/org/apache/xtable/delta/TestDeltaSchemaExtractor.java
@@ -562,6 +562,81 @@ public class TestDeltaSchemaExtractor {
         internalSchema, 
DeltaSchemaExtractor.getInstance().toInternalSchema(structRepresentation));
   }
 
+  @Test
+  public void testBinaryInMapAndArrayWithoutMetadata() {
+    InternalSchema expectedSchema =
+        InternalSchema.builder()
+            .name("struct")
+            .dataType(InternalType.RECORD)
+            .isNullable(false)
+            .fields(
+                Arrays.asList(
+                    InternalField.builder()
+                        .name("binaryList")
+                        .schema(
+                            InternalSchema.builder()
+                                .name("array")
+                                .isNullable(false)
+                                .dataType(InternalType.LIST)
+                                .fields(
+                                    Collections.singletonList(
+                                        InternalField.builder()
+                                            
.name(InternalField.Constants.ARRAY_ELEMENT_FIELD_NAME)
+                                            .parentPath("binaryList")
+                                            .schema(
+                                                InternalSchema.builder()
+                                                    .name("binary")
+                                                    
.dataType(InternalType.BYTES)
+                                                    .isNullable(false)
+                                                    .build())
+                                            .build()))
+                                .build())
+                        .build(),
+                    InternalField.builder()
+                        .name("binaryMap")
+                        .schema(
+                            InternalSchema.builder()
+                                .name("map")
+                                .isNullable(false)
+                                .dataType(InternalType.MAP)
+                                .fields(
+                                    Arrays.asList(
+                                        InternalField.builder()
+                                            
.name(InternalField.Constants.MAP_KEY_FIELD_NAME)
+                                            .parentPath("binaryMap")
+                                            .schema(
+                                                InternalSchema.builder()
+                                                    .name("string")
+                                                    
.dataType(InternalType.STRING)
+                                                    .isNullable(false)
+                                                    .build())
+                                            .build(),
+                                        InternalField.builder()
+                                            
.name(InternalField.Constants.MAP_VALUE_FIELD_NAME)
+                                            .parentPath("binaryMap")
+                                            .schema(
+                                                InternalSchema.builder()
+                                                    .name("binary")
+                                                    
.dataType(InternalType.BYTES)
+                                                    .isNullable(false)
+                                                    .build())
+                                            .build()))
+                                .build())
+                        .build()))
+            .build();
+
+    StructType structRepresentation =
+        new StructType()
+            .add("binaryList", DataTypes.createArrayType(DataTypes.BinaryType, 
false), false)
+            .add(
+                "binaryMap",
+                DataTypes.createMapType(DataTypes.StringType, 
DataTypes.BinaryType, false),
+                false);
+
+    Assertions.assertEquals(
+        expectedSchema, 
DeltaSchemaExtractor.getInstance().toInternalSchema(structRepresentation));
+  }
+
   @Test
   public void testNestedRecords() {
     InternalSchema internalSchema =

Reply via email to