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 f204dad41f [common] Fix substring transform query failure for non int 
type (#9326)
f204dad41f is described below

commit f204dad41f53ba29e6a2cf1c9c9e2ca992d4d08a
Author: Arnav Balyan <[email protected]>
AuthorDate: Sun Aug 23 20:52:16 2026 +0530

    [common] Fix substring transform query failure for non int type (#9326)
---
 .../paimon/predicate/SubstringTransform.java       | 15 +++++++++++-
 .../paimon/predicate/SubstringTransformTest.java   | 27 ++++++++++++++++++++++
 2 files changed, 41 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 483ff5515c..cb2c0f425c 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
@@ -107,7 +107,20 @@ public class SubstringTransform implements Transform {
 
     private static int readPosition(Object position, InternalRow row) {
         if (position instanceof FieldRef) {
-            return row.getInt(((FieldRef) position).index());
+            FieldRef ref = (FieldRef) position;
+            switch (ref.type().getTypeRoot()) {
+                case TINYINT:
+                    return row.getByte(ref.index());
+                case SMALLINT:
+                    return row.getShort(ref.index());
+                case INTEGER:
+                    return row.getInt(ref.index());
+                case BIGINT:
+                    return Math.toIntExact(row.getLong(ref.index()));
+                default:
+                    throw new IllegalArgumentException(
+                            "Unsupported substring position type: " + 
ref.type());
+            }
         }
         return Integer.parseInt(position.toString());
     }
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 8c66ee3066..7a955e524e 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
@@ -20,6 +20,7 @@ package org.apache.paimon.predicate;
 
 import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.GenericRow;
+import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.DataTypes;
 
 import org.junit.jupiter.api.Test;
@@ -109,6 +110,32 @@ class SubstringTransformTest {
         assertThat(result).isEqualTo(BinaryString.fromString("ell"));
     }
 
+    @Test
+    public void testSubstringRefInputsWithDifferentIntegerTypes() {
+        List<Object> positions = Arrays.asList((byte) 2, (short) 2, 2, 2L);
+        List<DataType> types =
+                Arrays.asList(
+                        DataTypes.TINYINT(),
+                        DataTypes.SMALLINT(),
+                        DataTypes.INT(),
+                        DataTypes.BIGINT());
+
+        for (int i = 0; i < positions.size(); i++) {
+            SubstringTransform transform =
+                    new SubstringTransform(
+                            Arrays.asList(
+                                    new FieldRef(0, "value", 
DataTypes.STRING()),
+                                    new FieldRef(1, "position", types.get(i)),
+                                    3));
+
+            assertThat(
+                            transform.transform(
+                                    GenericRow.of(
+                                            BinaryString.fromString("hello"), 
positions.get(i))))
+                    .isEqualTo(BinaryString.fromString("ell"));
+        }
+    }
+
     @Test
     public void testNullPositionYieldsNull() {
         List<Object> literal = new ArrayList<>();

Reply via email to