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 98a03a90cb [common] Fix SubstringTransform null check for field refs 
(#7987)
98a03a90cb is described below

commit 98a03a90cb8d95dac43af9a9e5c6a26d1f0b3368
Author: QuakeWang <[email protected]>
AuthorDate: Wed May 27 11:06:35 2026 +0800

    [common] Fix SubstringTransform null check for field refs (#7987)
    
    `SubstringTransform` checked source field nullability with column `0`,
    but read the value from `sourceFieldRef.index()`. When column `0` was
    null and the actual source field was non-null, substring masking
    incorrectly returned null.
    
    This PR uses the source field index for both the null check and value
    access, and adds a regression test for that case.
---
 .../org/apache/paimon/predicate/SubstringTransform.java     |  3 ++-
 .../org/apache/paimon/predicate/SubstringTransformTest.java | 13 +++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

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 00431a61f3..054422a201 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
@@ -56,7 +56,8 @@ public class SubstringTransform implements Transform {
         if (source instanceof FieldRef) {
             FieldRef sourceFieldRef = (FieldRef) source;
             checkArgument(sourceFieldRef.type().is(CHARACTER_STRING));
-            sourceString = row.isNullAt(0) ? null : 
row.getString(sourceFieldRef.index());
+            int sourceIndex = sourceFieldRef.index();
+            sourceString = row.isNullAt(sourceIndex) ? null : 
row.getString(sourceIndex);
         } else {
             sourceString = (BinaryString) inputs.get(0);
         }
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 8ddb74440b..b4d998bea9 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
@@ -99,4 +99,17 @@ class SubstringTransformTest {
                                 3));
         assertThat(result).isEqualTo(BinaryString.fromString("ell"));
     }
+
+    @Test
+    public void testSubstringRefInputUsesSourceFieldNullability() {
+        List<Object> inputs = new ArrayList<>();
+        inputs.add(new FieldRef(1, "f1", DataTypes.STRING()));
+        inputs.add(2);
+        inputs.add(3);
+        SubstringTransform transform = new SubstringTransform(inputs);
+
+        Object result = transform.transform(GenericRow.of(null, 
BinaryString.fromString("hello")));
+
+        assertThat(result).isEqualTo(BinaryString.fromString("ell"));
+    }
 }

Reply via email to