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]);
}
}