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