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 =