diff --git a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/TestTableSchemaEvolution.java b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/TestTableSchemaEvolution.java index 8ee0c163409a5..ab228c03d7d2d 100644 --- a/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/TestTableSchemaEvolution.java +++ b/hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/client/TestTableSchemaEvolution.java @@ -65,17 +65,24 @@ public class TestTableSchemaEvolution extends HoodieClientTestBase { private HoodieTestDataGenerator dataGenEvolved = new HoodieTestDataGenerator(); private HoodieTestDataGenerator dataGenDevolved = new HoodieTestDataGenerator(); - public static final String EXTRA_FIELD_SCHEMA = - "{\"name\": \"new_field\", \"type\": \"boolean\", \"default\": false},"; + public static final String EXTRA_FIELD_INT_SCHEMA = + "{\"name\": \"new_field\", \"type\": \"int\", \"default\": 0},"; + + public static final String EXTRA_FIELD_LONG_SCHEMA = + "{\"name\": \"new_field\", \"type\": \"long\", \"default\": 0},"; // TRIP_EXAMPLE_SCHEMA with a new_field added public static final String TRIP_EXAMPLE_SCHEMA_EVOLVED = TRIP_SCHEMA_PREFIX + EXTRA_TYPE_SCHEMA + MAP_TYPE_SCHEMA - + FARE_NESTED_SCHEMA + TIP_NESTED_SCHEMA + EXTRA_FIELD_SCHEMA + TRIP_SCHEMA_SUFFIX; + + FARE_NESTED_SCHEMA + TIP_NESTED_SCHEMA + EXTRA_FIELD_INT_SCHEMA + TRIP_SCHEMA_SUFFIX; // TRIP_EXAMPLE_SCHEMA with tip field removed public static final String TRIP_EXAMPLE_SCHEMA_DEVOLVED = TRIP_SCHEMA_PREFIX + EXTRA_TYPE_SCHEMA + MAP_TYPE_SCHEMA + FARE_NESTED_SCHEMA + TRIP_SCHEMA_SUFFIX; + // TRIP_EXAMPLE_SCHEMA with a new_field added + public static final String TRIP_EXAMPLE_SCHEMA_EVOLVED_AGAIN = TRIP_SCHEMA_PREFIX + EXTRA_TYPE_SCHEMA + MAP_TYPE_SCHEMA + + FARE_NESTED_SCHEMA + TIP_NESTED_SCHEMA + EXTRA_FIELD_LONG_SCHEMA + TRIP_SCHEMA_SUFFIX; + @Test public void testSchemaCompatibilityBasic() throws Exception { assertTrue(TableSchemaResolver.isSchemaCompatible(TRIP_EXAMPLE_SCHEMA, TRIP_EXAMPLE_SCHEMA), @@ -115,8 +122,11 @@ public void testSchemaCompatibilityBasic() throws Exception { assertTrue(TableSchemaResolver.isSchemaCompatible(TRIP_EXAMPLE_SCHEMA, TRIP_EXAMPLE_SCHEMA_EVOLVED), "Added field with default is compatible (Evolved Schema)"); + assertTrue(TableSchemaResolver.isSchemaCompatible(TRIP_EXAMPLE_SCHEMA_EVOLVED, TRIP_EXAMPLE_SCHEMA_EVOLVED_AGAIN), + "INT to LONG should be compatible"); + String multipleAddedFieldSchema = TRIP_SCHEMA_PREFIX + EXTRA_TYPE_SCHEMA + MAP_TYPE_SCHEMA + FARE_NESTED_SCHEMA - + TIP_NESTED_SCHEMA + EXTRA_FIELD_SCHEMA + EXTRA_FIELD_SCHEMA.replace("new_field", "new_new_field") + + TIP_NESTED_SCHEMA + EXTRA_FIELD_INT_SCHEMA + EXTRA_FIELD_INT_SCHEMA.replace("new_field", "new_new_field") + TRIP_SCHEMA_SUFFIX; assertTrue(TableSchemaResolver.isSchemaCompatible(TRIP_EXAMPLE_SCHEMA, multipleAddedFieldSchema), "Multiple added fields with defauls are compatible"); diff --git a/hudi-common/src/main/java/org/apache/hudi/common/table/TableSchemaResolver.java b/hudi-common/src/main/java/org/apache/hudi/common/table/TableSchemaResolver.java index 372b3936b5b2f..f92b17d65dbea 100644 --- a/hudi-common/src/main/java/org/apache/hudi/common/table/TableSchemaResolver.java +++ b/hudi-common/src/main/java/org/apache/hudi/common/table/TableSchemaResolver.java @@ -296,7 +296,7 @@ public MessageType convertAvroSchemaToParquet(Schema schema) { public static boolean isSchemaCompatible(Schema oldSchema, Schema newSchema) { if (oldSchema.getType() == newSchema.getType() && newSchema.getType() == Schema.Type.RECORD) { // record names must match: - if (!SchemaCompatibility.schemaNameEquals(oldSchema, newSchema)) { + if (!SchemaCompatibility.schemaNameEquals(newSchema, oldSchema)) { return false; } @@ -331,7 +331,7 @@ public static boolean isSchemaCompatible(Schema oldSchema, Schema newSchema) { } else { // Use the checks implemented by org.apache.avro.SchemaCompatibility.SchemaPairCompatibility compatResult = - org.apache.avro.SchemaCompatibility.checkReaderWriterCompatibility(oldSchema, newSchema); + org.apache.avro.SchemaCompatibility.checkReaderWriterCompatibility(newSchema, oldSchema); return compatResult.getType() == org.apache.avro.SchemaCompatibility.SchemaCompatibilityType.COMPATIBLE; } }