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 00431a61f3ff..054422a20125 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 final Object transform(InternalRow row) { 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 8ddb74440b7c..b4d998bea9ec 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 @@ public void testSubstringRefInputs() { 3)); assertThat(result).isEqualTo(BinaryString.fromString("ell")); } + + @Test + public void testSubstringRefInputUsesSourceFieldNullability() { + List 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")); + } }