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

fokko pushed a commit to branch branch-1.9
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/branch-1.9 by this push:
     new 907558c  AVRO-2400: Make schema resolution behave the same as previous 
versions (#526)
907558c is described below

commit 907558c65fa754a53b4a9493cebe692aecddfe02
Author: jacobtolar <[email protected]>
AuthorDate: Fri Jun 14 02:59:51 2019 -0500

    AVRO-2400: Make schema resolution behave the same as previous versions 
(#526)
    
    * [AVRO-2400] Make schema resolution behave the same as previous versions
    
    * AVRO-2400 make same schema resolution changes to SchemaCompatibility
    
    * make style check happy
    
    * fix failing tests
    
    * AVRO-2400 fix checkstyle issue
    
    (cherry picked from commit aa972ced3c001e0d9d8de6cd5013a1cb3b989551)
---
 doc/src/content/xdocs/spec.xml                              |  6 +++---
 lang/java/avro/src/main/java/org/apache/avro/Resolver.java  |  6 +++++-
 .../src/main/java/org/apache/avro/SchemaCompatibility.java  |  5 ++---
 .../apache/avro/io/parsing/ResolvingGrammarGenerator.java   |  3 +--
 .../test/java/org/apache/avro/TestSchemaCompatibility.java  |  6 ++++--
 .../org/apache/avro/TestSchemaCompatibilityMultiple.java    |  8 +++-----
 .../apache/avro/TestSchemaCompatibilityNameMismatch.java    |  5 -----
 .../src/test/java/org/apache/avro/TestSchemaValidation.java |  6 +++++-
 .../avro/src/test/java/org/apache/avro/TestSchemas.java     | 13 +++++++++++++
 9 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/doc/src/content/xdocs/spec.xml b/doc/src/content/xdocs/spec.xml
index 0c3ff0b..e3d2106 100644
--- a/doc/src/content/xdocs/spec.xml
+++ b/doc/src/content/xdocs/spec.xml
@@ -1129,9 +1129,9 @@
           <ul>
             <li>both schemas are arrays whose item types match</li>
             <li>both schemas are maps whose value types match</li>
-            <li>both schemas are enums whose names match</li>
-            <li>both schemas are fixed whose sizes and names match</li>
-            <li>both schemas are records with the same name</li>
+            <li>both schemas are enums whose (unqualified) names match</li>
+            <li>both schemas are fixed whose sizes and (unqualified) names 
match</li>
+            <li>both schemas are records with the same (unqualified) name</li>
             <li>either schema is a union</li>
             <li>both schemas have same primitive type</li>
             <li>the writer's schema may be <em>promoted</em> to the
diff --git a/lang/java/avro/src/main/java/org/apache/avro/Resolver.java 
b/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
index 3dab690..8608b2c 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/Resolver.java
@@ -691,8 +691,12 @@ public class Resolver {
     Schema.Type wt = w.getType();
     if (wt != r.getType())
       return false;
+
+    // Previously, the spec was somewhat ambiguous as to whether getFullName or
+    // getName should be used here. Using name rather than fully qualified name
+    // maintains backwards compatibility.
     if ((wt == Schema.Type.RECORD || wt == Schema.Type.FIXED || wt == 
Schema.Type.ENUM)
-        && !(w.getFullName() == null || 
w.getFullName().equals(r.getFullName())))
+        && !(w.getName() == null || w.getName().equals(r.getName())))
       return false;
 
     switch (w.getType()) {
diff --git 
a/lang/java/avro/src/main/java/org/apache/avro/SchemaCompatibility.java 
b/lang/java/avro/src/main/java/org/apache/avro/SchemaCompatibility.java
index c576116..f95ef04 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/SchemaCompatibility.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/SchemaCompatibility.java
@@ -94,12 +94,11 @@ public class SchemaCompatibility {
    * @return whether the names of the named schemas match or not.
    */
   public static boolean schemaNameEquals(final Schema reader, final Schema 
writer) {
-    final String writerFullName = writer.getFullName();
-    if (objectsEqual(reader.getFullName(), writerFullName)) {
+    if (objectsEqual(reader.getName(), writer.getName())) {
       return true;
     }
     // Apply reader aliases:
-    return reader.getAliases().contains(writerFullName);
+    return reader.getAliases().contains(writer.getFullName());
   }
 
   /**
diff --git 
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
 
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
index 00b4521..f3f61e2 100644
--- 
a/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
+++ 
b/lang/java/avro/src/main/java/org/apache/avro/io/parsing/ResolvingGrammarGenerator.java
@@ -113,8 +113,7 @@ public class ResolvingGrammarGenerator extends 
ValidatingGrammarGenerator {
       }
       return Symbol.seq(Symbol.alt(symbols, labels), 
Symbol.WRITER_UNION_ACTION);
 
-    }
-    if (action instanceof Resolver.ReaderUnion) {
+    } else if (action instanceof Resolver.ReaderUnion) {
       Resolver.ReaderUnion ru = (Resolver.ReaderUnion) action;
       Symbol s = generate(ru.actualAction, seen);
       return Symbol.seq(Symbol.unionAdjustAction(ru.firstMatch, s), 
Symbol.UNION);
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibility.java 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibility.java
index 9018f31..e868db2 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibility.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibility.java
@@ -235,9 +235,11 @@ public class TestSchemaCompatibility {
 
       new ReaderWriter(NULL_SCHEMA, NULL_SCHEMA),
       new ReaderWriter(ENUM_AB_ENUM_DEFAULT_A_RECORD, 
ENUM_ABC_ENUM_DEFAULT_A_RECORD),
-      new ReaderWriter(ENUM_AB_FIELD_DEFAULT_A_ENUM_DEFAULT_B_RECORD, 
ENUM_ABC_FIELD_DEFAULT_B_ENUM_DEFAULT_A_RECORD)
+      new ReaderWriter(ENUM_AB_FIELD_DEFAULT_A_ENUM_DEFAULT_B_RECORD, 
ENUM_ABC_FIELD_DEFAULT_B_ENUM_DEFAULT_A_RECORD),
 
-  );
+      // This is comparing two records that have an inner array of records with
+      // different namespaces.
+      new ReaderWriter(NS_RECORD1, NS_RECORD2));
 
   // 
-----------------------------------------------------------------------------------------------
 
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityMultiple.java
 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityMultiple.java
index ec6ef1e..5b76de2 100644
--- 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityMultiple.java
+++ 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityMultiple.java
@@ -101,16 +101,14 @@ public class TestSchemaCompatibilityMultiple {
         SchemaIncompatibilityType.NAME_MISMATCH, 
SchemaIncompatibilityType.TYPE_MISMATCH,
         SchemaIncompatibilityType.READER_FIELD_MISSING_DEFAULT_VALUE, 
SchemaIncompatibilityType.FIXED_SIZE_MISMATCH,
         SchemaIncompatibilityType.MISSING_UNION_BRANCH, 
SchemaIncompatibilityType.MISSING_UNION_BRANCH,
-        SchemaIncompatibilityType.MISSING_UNION_BRANCH, 
SchemaIncompatibilityType.NAME_MISMATCH,
-        SchemaIncompatibilityType.TYPE_MISMATCH);
+        SchemaIncompatibilityType.MISSING_UNION_BRANCH, 
SchemaIncompatibilityType.TYPE_MISMATCH);
     List<String> details = Arrays.asList("[B, D]", "expected: 
check_enum_name_type_ERR",
         "reader type: STRING not compatible with writer type: LONG", 
"extra_no_default_field", "expected: 8, found: 4",
         "reader union lacking writer type: DOUBLE", "reader union lacking 
writer type: STRING",
-        "reader union lacking writer type: LONG", "expected: nsA.recordA",
-        "reader type: STRING not compatible with writer type: BOOLEAN");
+        "reader union lacking writer type: LONG", "reader type: STRING not 
compatible with writer type: BOOLEAN");
     List<String> location = Arrays.asList("/fields/0/type/symbols", 
"/fields/1/type/name", "/fields/2/type",
         "/fields/3/type/fields/1", "/fields/3/type/fields/2/type/size", 
"/fields/3/type/fields/3/type/1",
-        "/fields/3/type/fields/3/type/2", "/fields/3/type/fields/4/type", 
"/fields/3/type/fields/5/type/name",
+        "/fields/3/type/fields/3/type/2", "/fields/3/type/fields/4/type",
         "/fields/3/type/fields/5/type/fields/1/type/items");
 
     validateIncompatibleSchemas(reader, writer, types, details, location);
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityNameMismatch.java
 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityNameMismatch.java
index 23945e7..02c9861 100644
--- 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityNameMismatch.java
+++ 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityNameMismatch.java
@@ -33,10 +33,6 @@ import org.junit.runners.Parameterized.Parameters;
 public class TestSchemaCompatibilityNameMismatch {
 
   private static final Schema FIXED_4_ANOTHER_NAME = 
Schema.createFixed("AnotherName", null, null, 4);
-  private static final Schema FIXED_4_NAMESPACE_V1 = 
Schema.createFixed("Fixed", null, "org.apache.avro.tests.v_1_0",
-      4);
-  private static final Schema FIXED_4_NAMESPACE_V2 = 
Schema.createFixed("Fixed", null, "org.apache.avro.tests.v_2_0",
-      4);
 
   @Parameters(name = "r: {0} | w: {1}")
   public static Iterable<Object[]> data() {
@@ -44,7 +40,6 @@ public class TestSchemaCompatibilityNameMismatch {
         { ENUM1_AB_SCHEMA, ENUM2_AB_SCHEMA, "expected: Enum2", "/name" },
         { EMPTY_RECORD2, EMPTY_RECORD1, "expected: Record1", "/name" },
         { FIXED_4_BYTES, FIXED_4_ANOTHER_NAME, "expected: AnotherName", 
"/name" },
-        { FIXED_4_NAMESPACE_V1, FIXED_4_NAMESPACE_V2, "expected: 
org.apache.avro.tests.v_2_0.Fixed", "/name" },
         { A_DINT_B_DENUM_1_RECORD1, A_DINT_B_DENUM_2_RECORD1, "expected: 
Enum2", "/fields/1/type/name" } };
     return Arrays.asList(fields);
   }
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaValidation.java 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaValidation.java
index 40086c9..23f06f2 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaValidation.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaValidation.java
@@ -107,7 +107,11 @@ public class TestSchemaValidation {
       // new ReaderWriter(LONG_LIST_RECORD, LONG_LIST_RECORD),
       // new ReaderWriter(LONG_LIST_RECORD, INT_LIST_RECORD),
 
-      new ReaderWriter(NULL_SCHEMA, NULL_SCHEMA));
+      new ReaderWriter(NULL_SCHEMA, NULL_SCHEMA),
+
+      // This is comparing two records that have an inner array of records with
+      // different namespaces.
+      new ReaderWriter(NS_RECORD1, NS_RECORD2));
 
   /** Collection of reader/writer schema pair that are incompatible. */
   public static final List<ReaderWriter> INCOMPATIBLE_READER_WRITER_TEST_CASES 
= list(
diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestSchemas.java 
b/lang/java/avro/src/test/java/org/apache/avro/TestSchemas.java
index 013fdda..ddaf540 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemas.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemas.java
@@ -100,6 +100,11 @@ public class TestSchemas {
   static final Schema FIXED_4_BYTES = Schema.createFixed("Fixed", null, null, 
4);
   static final Schema FIXED_8_BYTES = Schema.createFixed("Fixed", null, null, 
8);
 
+  static final Schema NS_RECORD1 = Schema.createRecord("Record1", null, null, 
false);
+  static final Schema NS_RECORD2 = Schema.createRecord("Record1", null, null, 
false);
+  static final Schema NS_INNER_RECORD1 = Schema.createRecord("InnerRecord1", 
null, "ns1", false);
+  static final Schema NS_INNER_RECORD2 = Schema.createRecord("InnerRecord1", 
null, "ns2", false);
+
   static {
     EMPTY_RECORD1.setFields(Collections.emptyList());
     EMPTY_RECORD2.setFields(Collections.emptyList());
@@ -121,6 +126,14 @@ public class TestSchemas {
         .setFields(list(new Field("a", INT_SCHEMA, null, 0), new Field("b", 
ENUM1_AB_SCHEMA, null, null)));
     A_DINT_B_DENUM_2_RECORD1
         .setFields(list(new Field("a", INT_SCHEMA, null, 0), new Field("b", 
ENUM2_AB_SCHEMA, null, null)));
+
+    NS_INNER_RECORD1.setFields(list(new Schema.Field("a", INT_SCHEMA)));
+    NS_INNER_RECORD2.setFields(list(new Schema.Field("a", INT_SCHEMA)));
+
+    NS_RECORD1
+        .setFields(list(new Schema.Field("f1", Schema.createUnion(NULL_SCHEMA, 
Schema.createArray(NS_INNER_RECORD1)))));
+    NS_RECORD2
+        .setFields(list(new Schema.Field("f1", Schema.createUnion(NULL_SCHEMA, 
Schema.createArray(NS_INNER_RECORD2)))));
   }
 
   // Recursive records

Reply via email to