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

codope pushed a commit to branch release-0.12.0
in repository https://gitbox.apache.org/repos/asf/hudi.git

commit 4d6aac90d9027077d361952454d8a9b1fc99dff5
Author: Danny Chan <[email protected]>
AuthorDate: Fri Aug 5 14:16:53 2022 +0800

    [HUDI-4545] Do not modify the current record directly for 
OverwriteNonDefaultsWithLatestAvroPayload (#6306)
---
 .../model/OverwriteNonDefaultsWithLatestAvroPayload.java      |  8 ++++++--
 .../model/TestOverwriteNonDefaultsWithLatestAvroPayload.java  | 11 +++++++++--
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java
index 93ac96cb42..6ce99aae21 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/model/OverwriteNonDefaultsWithLatestAvroPayload.java
@@ -20,6 +20,7 @@ package org.apache.hudi.common.model;
 
 import org.apache.avro.Schema;
 import org.apache.avro.generic.GenericRecord;
+import org.apache.avro.generic.GenericRecordBuilder;
 import org.apache.avro.generic.IndexedRecord;
 
 import org.apache.hudi.common.util.Option;
@@ -60,16 +61,19 @@ public class OverwriteNonDefaultsWithLatestAvroPayload 
extends OverwriteWithLate
     if (isDeleteRecord(insertRecord)) {
       return Option.empty();
     } else {
+      final GenericRecordBuilder builder = new GenericRecordBuilder(schema);
       List<Schema.Field> fields = schema.getFields();
       fields.forEach(field -> {
         Object value = insertRecord.get(field.name());
         value = field.schema().getType().equals(Schema.Type.STRING) && value 
!= null ? value.toString() : value;
         Object defaultValue = field.defaultVal();
         if (!overwriteField(value, defaultValue)) {
-          currentRecord.put(field.name(), value);
+          builder.set(field, value);
+        } else {
+          builder.set(field, currentRecord.get(field.pos()));
         }
       });
-      return Option.of(currentRecord);
+      return Option.of(builder.build());
     }
   }
 }
diff --git 
a/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java
 
b/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java
index c6eee05b87..9e3405b304 100644
--- 
a/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java
+++ 
b/hudi-common/src/test/java/org/apache/hudi/common/model/TestOverwriteNonDefaultsWithLatestAvroPayload.java
@@ -22,6 +22,7 @@ import org.apache.avro.JsonProperties;
 import org.apache.avro.Schema;
 import org.apache.avro.generic.GenericData;
 import org.apache.avro.generic.GenericRecord;
+import org.apache.avro.generic.IndexedRecord;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -31,6 +32,7 @@ import java.util.Collections;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
 
 /**
  * Unit tests {@link TestOverwriteNonDefaultsWithLatestAvroPayload}.
@@ -85,8 +87,13 @@ public class TestOverwriteNonDefaultsWithLatestAvroPayload {
     assertEquals(record1, payload1.getInsertValue(schema).get());
     assertEquals(record2, payload2.getInsertValue(schema).get());
 
-    assertEquals(payload1.combineAndGetUpdateValue(record2, schema).get(), 
record1);
-    assertEquals(payload2.combineAndGetUpdateValue(record1, schema).get(), 
record3);
+    IndexedRecord combinedVal1 = payload1.combineAndGetUpdateValue(record2, 
schema).get();
+    assertEquals(combinedVal1, record1);
+    assertNotSame(combinedVal1, record1);
+
+    IndexedRecord combinedVal2 = payload2.combineAndGetUpdateValue(record1, 
schema).get();
+    assertEquals(combinedVal2, record3);
+    assertNotSame(combinedVal2, record3);
   }
 
   @Test

Reply via email to