From f38329d6453acd2d8ba8a6fb5882ae6e89ef25eb Mon Sep 17 00:00:00 2001 From: Robert Yokota Date: Fri, 17 Jan 2025 17:14:53 -0800 Subject: [PATCH] DGS-19553 Ensure docs nested within arrays/maps are compared (#3519) --- .../kafka/serializers/AvroSchemaTest.java | 35 +++++++++++++++++++ .../kafka/schemaregistry/avro/AvroSchema.java | 8 +++++ 2 files changed, 43 insertions(+) diff --git a/avro-serializer/src/test/java/io/confluent/kafka/serializers/AvroSchemaTest.java b/avro-serializer/src/test/java/io/confluent/kafka/serializers/AvroSchemaTest.java index 735a115201d..4ffc2850eaa 100644 --- a/avro-serializer/src/test/java/io/confluent/kafka/serializers/AvroSchemaTest.java +++ b/avro-serializer/src/test/java/io/confluent/kafka/serializers/AvroSchemaTest.java @@ -687,6 +687,41 @@ public void testEnumWithDefault() throws Exception { assertNotEquals(new AvroSchema(enumSchema), new AvroSchema(enumSchemaWithDefault)); } + @Test + public void testArrayWithDoc() { + String s1 = "\n" + + "{\n" + + " \"type\": \"array\",\n" + + " \"items\": { \n" + + " \"type\": \"record\",\n" + + " \"name\": \"top\",\n" + + " \"doc\": \"test\",\n" + + " \"fields\": [\n" + + " {\n" + + " \"name\": \"field1\",\n" + + " \"type\": \"string\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + String s2 = "\n" + + "{\n" + + " \"type\": \"array\",\n" + + " \"items\": { \n" + + " \"type\": \"record\",\n" + + " \"name\": \"top\",\n" + + " \"doc\": \"test2\",\n" + + " \"fields\": [\n" + + " {\n" + + " \"name\": \"field1\",\n" + + " \"type\": \"string\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + assertNotEquals(new AvroSchema(s1), new AvroSchema(s2)); + } + private static void expectConversionException(JsonNode obj, AvroSchema schema) { try { AvroSchemaUtils.toObject(obj, schema); diff --git a/client/src/main/java/io/confluent/kafka/schemaregistry/avro/AvroSchema.java b/client/src/main/java/io/confluent/kafka/schemaregistry/avro/AvroSchema.java index 3f3ce70c2e5..5ebf6e25e82 100644 --- a/client/src/main/java/io/confluent/kafka/schemaregistry/avro/AvroSchema.java +++ b/client/src/main/java/io/confluent/kafka/schemaregistry/avro/AvroSchema.java @@ -260,6 +260,10 @@ private boolean metaEqual( return Objects.equals(schema1.getAliases(), schema2.getAliases()) && Objects.equals(schema1.getDoc(), schema2.getDoc()) && Objects.equals(schema1.getEnumDefault(), schema2.getEnumDefault()); + case ARRAY: + return metaEqual(schema1.getElementType(), schema2.getElementType(), cache); + case MAP: + return metaEqual(schema1.getValueType(), schema2.getValueType(), cache); case FIXED: return Objects.equals(schema1.getAliases(), schema2.getAliases()) && Objects.equals(schema1.getDoc(), schema2.getDoc()); @@ -335,6 +339,10 @@ private int metaHash(Schema schema, Map cache) { return result; case ENUM: return Objects.hash(schema.getAliases(), schema.getDoc(), schema.getEnumDefault()); + case ARRAY: + return metaHash(schema.getElementType(), cache); + case MAP: + return metaHash(schema.getValueType(), cache); case FIXED: return Objects.hash(schema.getAliases(), schema.getDoc()); case UNION: