diff --git a/paimon-common/src/main/java/org/apache/paimon/types/InternalRowToSizeVisitor.java b/paimon-common/src/main/java/org/apache/paimon/types/InternalRowToSizeVisitor.java index dbac55a07dde..721271ad1f8f 100644 --- a/paimon-common/src/main/java/org/apache/paimon/types/InternalRowToSizeVisitor.java +++ b/paimon-common/src/main/java/org/apache/paimon/types/InternalRowToSizeVisitor.java @@ -18,6 +18,8 @@ package org.apache.paimon.types; +import org.apache.paimon.data.Blob; +import org.apache.paimon.data.BlobData; import org.apache.paimon.data.DataGetters; import org.apache.paimon.data.InternalArray; import org.apache.paimon.data.InternalMap; @@ -229,7 +231,13 @@ public BiFunction visit(BlobType blobType) { if (row.isNullAt(index)) { return NULL_SIZE; } else { - return Math.toIntExact(row.getVariant(index).sizeInBytes()); + Blob blob = row.getBlob(index); + if (blob instanceof BlobData) { + return ((BlobData) blob).toData().length; + } else { + // BlobRef and BlobView + return Math.toIntExact(blob.toDescriptor().length()); + } } }; } diff --git a/paimon-common/src/test/java/org/apache/paimon/types/InternalRowToSizeVisitorTest.java b/paimon-common/src/test/java/org/apache/paimon/types/InternalRowToSizeVisitorTest.java index cfdae649c190..56bb18daad95 100644 --- a/paimon-common/src/test/java/org/apache/paimon/types/InternalRowToSizeVisitorTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/types/InternalRowToSizeVisitorTest.java @@ -19,6 +19,7 @@ package org.apache.paimon.types; import org.apache.paimon.data.BinaryString; +import org.apache.paimon.data.Blob; import org.apache.paimon.data.DataGetters; import org.apache.paimon.data.Decimal; import org.apache.paimon.data.GenericArray; @@ -192,4 +193,18 @@ void testCalculatorSize() { Assertions.assertThat(feildSizeCalculator.get(23).apply(row, 23)).isEqualTo(0); } + + @Test + void testBlobSize() { + RowType rowType = RowType.builder().field("b", DataTypes.BLOB()).build(); + InternalRowToSizeVisitor visitor = new InternalRowToSizeVisitor(); + BiFunction calculator = + rowType.getFieldTypes().get(0).accept(visitor); + + GenericRow row = GenericRow.of(Blob.fromData(new byte[] {1, 2, 3})); + Assertions.assertThat(calculator.apply(row, 0)).isEqualTo(3); + + GenericRow nullRow = GenericRow.of(new Object[] {null}); + Assertions.assertThat(calculator.apply(nullRow, 0)).isEqualTo(0); + } }