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 27dad39bdd [flink] Fix literal conversion for BETWEEN predicates 
(#9310)
27dad39bdd is described below

commit 27dad39bdd0b7e2b6dc566edee4db5001e0c3c43
Author: QuakeWang <[email protected]>
AuthorDate: Thu Aug 20 15:41:12 2026 +0800

    [flink] Fix literal conversion for BETWEEN predicates (#9310)
---
 .../apache/paimon/flink/PredicateConverter.java    |  5 ++-
 .../paimon/flink/PredicateConverterTest.java       | 41 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/PredicateConverter.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/PredicateConverter.java
index d5413f0859..db3754f86d 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/PredicateConverter.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/PredicateConverter.java
@@ -116,8 +116,11 @@ public class PredicateConverter implements 
ExpressionVisitor<Predicate> {
         } else if (func == BuiltInFunctionDefinitions.BETWEEN) {
             FieldReferenceExpression fieldRefExpr =
                     
extractFieldReference(children.get(0)).orElseThrow(UnsupportedExpression::new);
+            DataType fieldType = fieldRefExpr.getOutputDataType();
             return builder.between(
-                    builder.indexOf(fieldRefExpr.getName()), children.get(1), 
children.get(2));
+                    builder.indexOf(fieldRefExpr.getName()),
+                    extractLiteral(fieldType, children.get(1)),
+                    extractLiteral(fieldType, children.get(2)));
         } else if (func == BuiltInFunctionDefinitions.LIKE) {
             FieldReferenceExpression fieldRefExpr =
                     
extractFieldReference(children.get(0)).orElseThrow(UnsupportedExpression::new);
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/PredicateConverterTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/PredicateConverterTest.java
index d86293277e..e05773991f 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/PredicateConverterTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/PredicateConverterTest.java
@@ -273,6 +273,47 @@ public class PredicateConverterTest {
                         BUILDER.equal(3, false)));
     }
 
+    @Test
+    public void testBetweenWithImplicitNumericConversion() {
+        Predicate predicate =
+                call(
+                                BuiltInFunctionDefinitions.BETWEEN,
+                                field(0, DataTypes.BIGINT()),
+                                literal(10),
+                                literal(20))
+                        .accept(new PredicateConverter(RowType.of(new 
BigIntType())));
+
+        assertThat(predicate.test(GenericRow.of(9L))).isFalse();
+        assertThat(predicate.test(GenericRow.of(10L))).isTrue();
+        assertThat(predicate.test(GenericRow.of(15L))).isTrue();
+        assertThat(predicate.test(GenericRow.of(20L))).isTrue();
+        assertThat(predicate.test(GenericRow.of(21L))).isFalse();
+        assertThat(predicate.test(GenericRow.of((Object) null))).isFalse();
+    }
+
+    @Test
+    public void testBetweenWithNullBounds() {
+        PredicateConverter converter = new PredicateConverter(RowType.of(new 
BigIntType()));
+        FieldReferenceExpression field = field(0, DataTypes.BIGINT());
+        Predicate nullLowerBound =
+                call(
+                                BuiltInFunctionDefinitions.BETWEEN,
+                                field,
+                                literal(null, DataTypes.BIGINT()),
+                                literal(20))
+                        .accept(converter);
+        Predicate nullUpperBound =
+                call(
+                                BuiltInFunctionDefinitions.BETWEEN,
+                                field,
+                                literal(10),
+                                literal(null, DataTypes.BIGINT()))
+                        .accept(converter);
+
+        assertThat(nullLowerBound.test(GenericRow.of(15L))).isFalse();
+        assertThat(nullUpperBound.test(GenericRow.of(15L))).isFalse();
+    }
+
     @MethodSource("provideLikeExpressions")
     @ParameterizedTest
     public void testStartsWith(

Reply via email to