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 00eb2ae954 [core] Fix incorrect substring result for unicode
characters (#9328)
00eb2ae954 is described below
commit 00eb2ae95489c796b0f9559afc35402b801c053d
Author: Arnav Balyan <[email protected]>
AuthorDate: Sun Aug 23 20:52:03 2026 +0530
[core] Fix incorrect substring result for unicode characters (#9328)
---
.../java/org/apache/paimon/predicate/SubstringTransform.java | 10 +++++-----
.../org/apache/paimon/predicate/SubstringTransformTest.java | 9 +++++++++
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git
a/paimon-common/src/main/java/org/apache/paimon/predicate/SubstringTransform.java
b/paimon-common/src/main/java/org/apache/paimon/predicate/SubstringTransform.java
index 9094837d72..483ff5515c 100644
---
a/paimon-common/src/main/java/org/apache/paimon/predicate/SubstringTransform.java
+++
b/paimon-common/src/main/java/org/apache/paimon/predicate/SubstringTransform.java
@@ -75,21 +75,21 @@ public class SubstringTransform implements Transform {
return null;
}
- String sourceJavaString = sourceString.toString();
+ int sourceLength = sourceString.numChars();
int beginIndex = readPosition(inputs.get(1), row);
- if (beginIndex > sourceJavaString.length()) {
+ if (beginIndex > sourceLength) {
return BinaryString.EMPTY_UTF8;
}
- int endIndex = sourceJavaString.length();
+ int endIndex = sourceLength;
if (hasLength) {
endIndex = beginIndex + readPosition(inputs.get(2), row) - 1;
}
- endIndex = Math.min(endIndex, sourceJavaString.length());
+ endIndex = Math.min(endIndex, sourceLength);
beginIndex--;
checkArgument(beginIndex < endIndex);
- return BinaryString.fromString(sourceJavaString.substring(beginIndex,
endIndex));
+ return sourceString.substring(beginIndex, endIndex);
}
private static boolean isNullPosition(Object position, InternalRow row) {
diff --git
a/paimon-common/src/test/java/org/apache/paimon/predicate/SubstringTransformTest.java
b/paimon-common/src/test/java/org/apache/paimon/predicate/SubstringTransformTest.java
index 9dd80a5f94..8c66ee3066 100644
---
a/paimon-common/src/test/java/org/apache/paimon/predicate/SubstringTransformTest.java
+++
b/paimon-common/src/test/java/org/apache/paimon/predicate/SubstringTransformTest.java
@@ -25,6 +25,7 @@ import org.apache.paimon.types.DataTypes;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -82,6 +83,14 @@ class SubstringTransformTest {
assertThat(result).isEqualTo(BinaryString.fromString(""));
}
+ @Test
+ public void testSubstringWithSupplementaryCharacter() {
+ SubstringTransform transform =
+ new
SubstringTransform(Arrays.asList(BinaryString.fromString("A😀B"), 2, 1));
+
+
assertThat(transform.transform(GenericRow.of())).isEqualTo(BinaryString.fromString("😀"));
+ }
+
@Test
public void testSubstringRefInputs() {
List<Object> inputs = new ArrayList<>();