This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch release-0.8 in repository https://gitbox.apache.org/repos/asf/paimon.git
commit 652c0f294223978ac22f9f0fd4eb798e102a4b64 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]); } }
