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

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new c9636c28e [core] Fix BinaryWriter.createValueSetter to lazy create 
serializer
c9636c28e is described below

commit c9636c28eb55a14ee73c4a4d9aa49e723826e5db
Author: Jingsong <[email protected]>
AuthorDate: Fri Jun 7 18:52:44 2024 +0800

    [core] Fix BinaryWriter.createValueSetter to lazy create serializer
---
 .../java/org/apache/paimon/data/BinaryWriter.java  | 26 ++++++++--------------
 .../data/serializer/InternalRowSerializer.java     |  1 +
 2 files changed, 10 insertions(+), 17 deletions(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/data/BinaryWriter.java 
b/paimon-common/src/main/java/org/apache/paimon/data/BinaryWriter.java
index 8c890be52..d17d51e49 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/BinaryWriter.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/BinaryWriter.java
@@ -24,7 +24,6 @@ import 
org.apache.paimon.data.serializer.InternalRowSerializer;
 import org.apache.paimon.data.serializer.InternalSerializers;
 import org.apache.paimon.data.serializer.Serializer;
 import org.apache.paimon.types.DataType;
-import org.apache.paimon.types.DataTypeRoot;
 import org.apache.paimon.types.DecimalType;
 import org.apache.paimon.types.LocalZonedTimestampType;
 import org.apache.paimon.types.TimestampType;
@@ -155,7 +154,6 @@ public interface BinaryWriter {
     }
 
     static ValueSetter createValueSetter(DataType elementType, Serializer<?> 
serializer) {
-        Serializer<?> finalSerializer = createSerializerIfNeed(elementType, 
serializer);
         // ordered by type root definition
         switch (elementType.getTypeRoot()) {
             case CHAR:
@@ -190,37 +188,31 @@ public interface BinaryWriter {
                 return (writer, pos, value) ->
                         writer.writeTimestamp(pos, (Timestamp) value, 
timestampPrecision);
             case ARRAY:
+                final Serializer<?> arraySerializer =
+                        serializer == null ? 
InternalSerializers.create(elementType) : serializer;
                 return (writer, pos, value) ->
                         writer.writeArray(
                                 pos,
                                 (InternalArray) value,
-                                (InternalArraySerializer) finalSerializer);
+                                (InternalArraySerializer) arraySerializer);
             case MULTISET:
             case MAP:
+                final Serializer<?> mapSerializer =
+                        serializer == null ? 
InternalSerializers.create(elementType) : serializer;
                 return (writer, pos, value) ->
                         writer.writeMap(
-                                pos, (InternalMap) value, 
(InternalMapSerializer) finalSerializer);
+                                pos, (InternalMap) value, 
(InternalMapSerializer) mapSerializer);
             case ROW:
+                final Serializer<?> rowSerializer =
+                        serializer == null ? 
InternalSerializers.create(elementType) : serializer;
                 return (writer, pos, value) ->
                         writer.writeRow(
-                                pos, (InternalRow) value, 
(InternalRowSerializer) finalSerializer);
+                                pos, (InternalRow) value, 
(InternalRowSerializer) rowSerializer);
             default:
                 throw new IllegalArgumentException();
         }
     }
 
-    static Serializer<?> createSerializerIfNeed(DataType elementType, 
Serializer<?> serializer) {
-        Serializer<?> finalSerializer = serializer;
-        DataTypeRoot typeRoot = elementType.getTypeRoot();
-        if (finalSerializer == null
-                && (typeRoot == DataTypeRoot.MAP
-                        || typeRoot == DataTypeRoot.ROW
-                        || typeRoot == DataTypeRoot.ARRAY)) {
-            finalSerializer = InternalSerializers.create(elementType);
-        }
-        return finalSerializer;
-    }
-
     /** Accessor for setting the elements of a binary writer during runtime. */
     interface ValueSetter extends Serializable {
         void setValue(BinaryWriter writer, int pos, Object value);
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/data/serializer/InternalRowSerializer.java
 
b/paimon-common/src/main/java/org/apache/paimon/data/serializer/InternalRowSerializer.java
index 97a5ae31d..8a32a222c 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/data/serializer/InternalRowSerializer.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/data/serializer/InternalRowSerializer.java
@@ -73,6 +73,7 @@ public class InternalRowSerializer extends 
AbstractRowDataSerializer<InternalRow
         for (int i = 0; i < types.length; i++) {
             DataType type = types[i];
             fieldGetters[i] = InternalRow.createFieldGetter(type, i);
+            // pass serializer to avoid infinite loop
             valueSetters[i] = BinaryWriter.createValueSetter(type, 
fieldSerializers[i]);
         }
     }

Reply via email to