diff --git a/fastserde/avro-fastserde-tests-common/src/test/java/com/linkedin/avro/fastserde/FastDeserializerGeneratorTest.java b/fastserde/avro-fastserde-tests-common/src/test/java/com/linkedin/avro/fastserde/FastDeserializerGeneratorTest.java index 885f56c3..5920696a 100644 --- a/fastserde/avro-fastserde-tests-common/src/test/java/com/linkedin/avro/fastserde/FastDeserializerGeneratorTest.java +++ b/fastserde/avro-fastserde-tests-common/src/test/java/com/linkedin/avro/fastserde/FastDeserializerGeneratorTest.java @@ -18,7 +18,7 @@ public class FastDeserializerGeneratorTest { @Test - public void testSchemaForFixedField() throws IOException, InterruptedException { + public void testDeserializationOfFixedField() throws IOException, InterruptedException { if (Utils.isAvro14()) { throw new SkipException("Avro 1.4 doesn't have schemas for GenericFixed type"); } @@ -27,7 +27,9 @@ public void testSchemaForFixedField() throws IOException, InterruptedException { Schema readerSchema = AvroCompatibilityHelper.parse("{\"type\":\"record\",\"name\":\"topLevelRecord\",\"fields\":[{\"name\":\"fixedField\",\"type\":{\"type\":\"fixed\",\"name\":\"FixedType\",\"size\":5,\"newField\": \"New field to change something\"}}]}"); GenericRecord writtenRecord = new GenericData.Record(writerSchema); - writtenRecord.put("fixedField", AvroCompatibilityHelper.newFixed(writerSchema.getField("fixedField").schema(), new byte[]{1,2,3,4,5})); + + byte[] writtenFixedFieldData = new byte[]{1,2,3,4,5}; + writtenRecord.put("fixedField", AvroCompatibilityHelper.newFixed(writerSchema.getField("fixedField").schema(), writtenFixedFieldData)); byte[] writeBytes = serialize(writtenRecord); @@ -42,6 +44,7 @@ public void testSchemaForFixedField() throws IOException, InterruptedException { Schema fixedFieldSchema = AvroSchemaUtil.getDeclaredSchema(fixedField); Assert.assertNotNull(fixedFieldSchema, "Schema for field must always be set."); + Assert.assertEquals(fixedField.bytes(), writtenFixedFieldData); } private byte[] serialize(GenericRecord record) throws IOException { diff --git a/fastserde/avro-fastserde/src/main/java/com/linkedin/avro/fastserde/FastDeserializerGenerator.java b/fastserde/avro-fastserde/src/main/java/com/linkedin/avro/fastserde/FastDeserializerGenerator.java index 92915009..5a50acd5 100644 --- a/fastserde/avro-fastserde/src/main/java/com/linkedin/avro/fastserde/FastDeserializerGenerator.java +++ b/fastserde/avro-fastserde/src/main/java/com/linkedin/avro/fastserde/FastDeserializerGenerator.java @@ -214,20 +214,24 @@ private void processSimpleType(Schema schema, Schema readerSchema, JBlock method processEnum(readerSchema, methodBody, action, putExpressionIntoParent); break; case FIXED: - // to preserve reader fixed specific options use reader field schema + final Schema fixedFieldSchema; if (action.getShouldRead() && readerSchema != null && Schema.Type.FIXED.equals(readerSchema.getType())) { - processFixed(readerSchema, methodBody, action, putExpressionIntoParent, reuseSupplier); + // to preserve reader-specific options use reader field schema + fixedFieldSchema = readerSchema; } else { - processFixed(schema, methodBody, action, putExpressionIntoParent, reuseSupplier); + fixedFieldSchema = schema; } + processFixed(fixedFieldSchema, methodBody, action, putExpressionIntoParent, reuseSupplier); break; default: - // to preserve reader string specific options use reader field schema + final Schema primitiveFieldSchema; if (action.getShouldRead() && readerSchema != null && Schema.Type.STRING.equals(readerSchema.getType())) { - processPrimitive(readerSchema, methodBody, action, putExpressionIntoParent, reuseSupplier); + // to preserve reader-specific options use reader field schema + primitiveFieldSchema = readerSchema; } else { - processPrimitive(schema, methodBody, action, putExpressionIntoParent, reuseSupplier); + primitiveFieldSchema = schema; } + processPrimitive(primitiveFieldSchema, methodBody, action, putExpressionIntoParent, reuseSupplier); break; } }