This is an automated email from the ASF dual-hosted git repository.
JingsongLi 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 eb986103ce [common] Fix SliceComparator on BINARY and VARBINARY fields
(#8873) (#8874)
eb986103ce is described below
commit eb986103ce6a690b4e03670d70449a16e5c867eb
Author: Jordan Epstein <[email protected]>
AuthorDate: Tue Jul 28 08:10:57 2026 -0500
[common] Fix SliceComparator on BINARY and VARBINARY fields (#8873) (#8874)
---
.../data/serializer/RowCompactedSerializer.java | 13 +++++--
.../serializer/RowCompactedSerializerTest.java | 42 ++++++++++++++++++++++
2 files changed, 53 insertions(+), 2 deletions(-)
diff --git
a/paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java
b/paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java
index 4ceffc8f5f..c7fb58417a 100644
---
a/paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java
+++
b/paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java
@@ -40,6 +40,7 @@ import org.apache.paimon.types.DataType;
import org.apache.paimon.types.RowKind;
import org.apache.paimon.types.RowType;
import org.apache.paimon.types.VectorType;
+import org.apache.paimon.utils.SortUtil;
import org.apache.paimon.utils.TypeCheckUtils;
import org.apache.paimon.utils.VarLengthIntUtils;
@@ -760,8 +761,16 @@ public class RowCompactedSerializer implements
Serializer<InternalRow> {
FieldReader fieldReader = fieldReaders[i];
Object o1 = fieldReader.readField(reader1, i);
Object o2 = fieldReader.readField(reader2, i);
- @SuppressWarnings({"unchecked", "rawtypes"})
- int comp = ((Comparable) o1).compareTo(o2);
+ int comp;
+ if (o1 instanceof byte[]) {
+ // BINARY / VARBINARY fields read back as byte[],
which does not
+ // implement Comparable; order them like BinaryRow
does.
+ comp = SortUtil.compareBinary((byte[]) o1,
(byte[]) o2);
+ } else {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ int comparableComp = ((Comparable)
o1).compareTo(o2);
+ comp = comparableComp;
+ }
if (comp != 0) {
return comp;
}
diff --git
a/paimon-common/src/test/java/org/apache/paimon/data/serializer/RowCompactedSerializerTest.java
b/paimon-common/src/test/java/org/apache/paimon/data/serializer/RowCompactedSerializerTest.java
index 9b55fe2261..833a38a6f5 100644
---
a/paimon-common/src/test/java/org/apache/paimon/data/serializer/RowCompactedSerializerTest.java
+++
b/paimon-common/src/test/java/org/apache/paimon/data/serializer/RowCompactedSerializerTest.java
@@ -23,17 +23,21 @@ import org.apache.paimon.data.BinaryVector;
import org.apache.paimon.data.GenericRow;
import org.apache.paimon.data.InternalRow;
import org.apache.paimon.data.variant.GenericVariant;
+import org.apache.paimon.memory.MemorySlice;
import org.apache.paimon.types.DataType;
import org.apache.paimon.types.DataTypes;
import org.apache.paimon.types.RowType;
import org.junit.jupiter.api.Test;
+import java.util.Comparator;
+
import static org.apache.paimon.data.BinaryString.fromString;
import static
org.apache.paimon.data.serializer.InternalRowSerializerTest.createArray;
import static
org.apache.paimon.data.serializer.InternalRowSerializerTest.createMap;
import static
org.apache.paimon.data.serializer.InternalRowSerializerTest.createRow;
import static
org.apache.paimon.data.serializer.InternalRowSerializerTest.deepEqualsInternalRow;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/** Test for {@link RowCompactedSerializer}. */
@@ -202,6 +206,44 @@ abstract class RowCompactedSerializerTest extends
SerializerTestInstance<Interna
}
}
+ static final class BinaryFieldTest extends RowCompactedSerializerTest {
+ public BinaryFieldTest() {
+ super(getRowSerializer(), getData());
+ }
+
+ private static InternalRow[] getData() {
+ return new GenericRow[] {
+ GenericRow.of(1, new byte[] {1, 2, 3}),
+ GenericRow.of(1, new byte[] {1, 2, 4}),
+ GenericRow.of(2, new byte[] {(byte) 0xFF})
+ };
+ }
+
+ private static RowCompactedSerializer getRowSerializer() {
+ return new RowCompactedSerializer(RowType.of(DataTypes.INT(),
DataTypes.BYTES()));
+ }
+
+ @Test
+ public void testSliceComparatorOnBinaryFields() {
+ RowCompactedSerializer serializer = getRowSerializer();
+ Comparator<MemorySlice> comparator =
serializer.createSliceComparator();
+ MemorySlice small =
+ MemorySlice.wrap(
+ serializer.serializeToBytes(GenericRow.of(1, new
byte[] {1, 2, 3})));
+ MemorySlice large =
+ MemorySlice.wrap(
+ serializer.serializeToBytes(GenericRow.of(1, new
byte[] {1, 2, 4})));
+ MemorySlice unsigned =
+ MemorySlice.wrap(
+ serializer.serializeToBytes(
+ GenericRow.of(1, new byte[] {(byte)
0xFF})));
+ assertThat(comparator.compare(small, large)).isLessThan(0);
+ assertThat(comparator.compare(large, small)).isGreaterThan(0);
+ assertThat(comparator.compare(small, small)).isEqualTo(0);
+ assertThat(comparator.compare(unsigned, small)).isGreaterThan(0);
+ }
+ }
+
static final class VectorTypesTest extends RowCompactedSerializerTest {
public VectorTypesTest() {
super(getRowSerializer(), getData());