Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,12 @@ public Predicate visit(CallExpression call) {
} else if (func == BuiltInFunctionDefinitions.BETWEEN) {
FieldReferenceExpression fieldRefExpr =
extractFieldReference(children.get(0)).orElseThrow(UnsupportedExpression::new);
Object lowerBound =
extractLiteral(fieldRefExpr.getOutputDataType(), children.get(1));
Object upperBound =
extractLiteral(fieldRefExpr.getOutputDataType(), children.get(2));
return builder.between(
builder.indexOf(fieldRefExpr.getName()), children.get(1), children.get(2));
builder.indexOf(fieldRefExpr.getName()), lowerBound, upperBound);
} else if (func == BuiltInFunctionDefinitions.LIKE) {
FieldReferenceExpression fieldRefExpr =
extractFieldReference(children.get(0)).orElseThrow(UnsupportedExpression::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,33 @@ public class PredicateConverterTest {

private static final PredicateConverter CONVERTER = new PredicateConverter(BUILDER);

/**
* Stronger than toString equality: BETWEEN must evaluate against rows. The parameterized
* toString check can pass even when Flink {@code ValueLiteralExpression} nodes were stored as
* literals without {@code extractLiteral}.
*/
@Test
public void testBetweenEvaluatesAgainstRow() {
FieldReferenceExpression longRefExpr =
new FieldReferenceExpression(
"long1", DataTypes.BIGINT(), Integer.MAX_VALUE, Integer.MAX_VALUE);
CallExpression between =
CallExpression.permanent(
BuiltInFunctionDefinitions.BETWEEN,
Arrays.asList(
longRefExpr,
new ValueLiteralExpression(10),
new ValueLiteralExpression(20)),
DataTypes.BOOLEAN());

Predicate predicate = between.accept(CONVERTER);
assertThat(predicate.test(GenericRow.of(15L))).isTrue();
assertThat(predicate.test(GenericRow.of(10L))).isTrue();
assertThat(predicate.test(GenericRow.of(20L))).isTrue();
assertThat(predicate.test(GenericRow.of(9L))).isFalse();
assertThat(predicate.test(GenericRow.of(21L))).isFalse();
}

@MethodSource("provideResolvedExpression")
@ParameterizedTest
public void testVisitAndAutoTypeInference(ResolvedExpression expression, Predicate expected) {
Expand Down Expand Up @@ -252,7 +279,7 @@ public static Stream<Arguments> provideResolvedExpression() {
BuiltInFunctionDefinitions.BETWEEN,
Arrays.asList(longRefExpr, intLitExpr, intLitExpr2),
DataTypes.BOOLEAN()),
BUILDER.between(0, 10, 20)));
BUILDER.between(0, 10L, 20L)));
}

@MethodSource("provideLikeExpressions")
Expand Down