From f8e1f0fc4c59e661c828ef6135a740b3f6383225 Mon Sep 17 00:00:00 2001 From: Arnav Balyan Date: Thu, 6 Aug 2026 22:18:44 +0530 Subject: [PATCH 1/2] update --- .../paimon/types/InternalRowToSizeVisitor.java | 10 +++++++++- .../types/InternalRowToSizeVisitorTest.java | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) 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); + } } From 21745df290120905748733f7412b9cf2bda2a3c2 Mon Sep 17 00:00:00 2001 From: Arnav Balyan Date: Fri, 14 Aug 2026 15:03:24 +0530 Subject: [PATCH 2/2] update --- .../types/InternalRowToSizeVisitor.java | 19 ++++++-- .../types/InternalRowToSizeVisitorTest.java | 45 ++++++++++++++++--- 2 files changed, 55 insertions(+), 9 deletions(-) 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 721271ad1f8f..3129be9a8769 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 @@ -20,6 +20,9 @@ import org.apache.paimon.data.Blob; import org.apache.paimon.data.BlobData; +import org.apache.paimon.data.BlobDescriptor; +import org.apache.paimon.data.BlobRef; +import org.apache.paimon.data.BlobView; import org.apache.paimon.data.DataGetters; import org.apache.paimon.data.InternalArray; import org.apache.paimon.data.InternalMap; @@ -34,6 +37,7 @@ public class InternalRowToSizeVisitor implements DataTypeVisitor> { public static final int NULL_SIZE = 0; + private static final int UNKNOWN_SIZE = 1; @Override public BiFunction visit(CharType charType) { @@ -234,14 +238,23 @@ public BiFunction visit(BlobType blobType) { Blob blob = row.getBlob(index); if (blob instanceof BlobData) { return ((BlobData) blob).toData().length; - } else { - // BlobRef and BlobView - return Math.toIntExact(blob.toDescriptor().length()); + } else if (blob instanceof BlobRef) { + return descriptorLength(blob.toDescriptor()); + } else if (blob instanceof BlobView) { + BlobView view = (BlobView) blob; + return view.isResolved() + ? descriptorLength(view.toDescriptor()) + : view.viewStruct().serialize().length; } + return UNKNOWN_SIZE; } }; } + private static int descriptorLength(BlobDescriptor descriptor) { + return descriptor.length() < 0 ? UNKNOWN_SIZE : Math.toIntExact(descriptor.length()); + } + @Override public BiFunction visit(ArrayType arrayType) { return (row, index) -> { 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 56bb18daad95..15c198774c4b 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 @@ -18,14 +18,18 @@ package org.apache.paimon.types; +import org.apache.paimon.catalog.Identifier; import org.apache.paimon.data.BinaryString; import org.apache.paimon.data.Blob; +import org.apache.paimon.data.BlobDescriptor; +import org.apache.paimon.data.BlobViewStruct; import org.apache.paimon.data.DataGetters; import org.apache.paimon.data.Decimal; import org.apache.paimon.data.GenericArray; import org.apache.paimon.data.GenericMap; import org.apache.paimon.data.GenericRow; import org.apache.paimon.data.Timestamp; +import org.apache.paimon.utils.UriReader; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -196,15 +200,44 @@ void testCalculatorSize() { @Test void testBlobSize() { + Assertions.assertThat(blobSize(Blob.fromData(new byte[] {1, 2, 3}))).isEqualTo(3); + Assertions.assertThat(blobSize(null)).isEqualTo(0); + } + + @Test + void testBlobRefSize() { + Assertions.assertThat( + blobSize( + Blob.fromDescriptor( + UriReader.fromHttp(), + new BlobDescriptor("https://example.com/blob", 0, 3)))) + .isEqualTo(3); + Assertions.assertThat(blobSize(Blob.fromHttp("https://example.com/blob"))).isEqualTo(1); + } + + @Test + void testUnresolvedBlobViewSize() { + BlobViewStruct viewStruct = new BlobViewStruct(Identifier.create("db", "t"), 1, 2L); + Assertions.assertThat(blobSize(Blob.fromView(viewStruct))) + .isEqualTo(viewStruct.serialize().length); + } + + @Test + void testBlobStreamSize() { + Assertions.assertThat( + blobSize( + Blob.fromInputStream( + () -> { + throw new AssertionError(); + }))) + .isEqualTo(1); + } + + private int blobSize(Blob blob) { 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); + return calculator.apply(GenericRow.of(blob), 0); } }