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<>();

Reply via email to