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(