This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/master by this push:
new e85f8f43547 [HUDI-7309] Disable constructing AND & OR filter
predicates when filter pushing down for any of its operand's logical type for
is unsupported in ExpressionPredicates::toParquetPredicate (#10524)
e85f8f43547 is described below
commit e85f8f43547cf107ce4dedf737eede74e2c811e7
Author: Paul Zhang <[email protected]>
AuthorDate: Fri Jan 19 10:27:36 2024 +0800
[HUDI-7309] Disable constructing AND & OR filter predicates when filter
pushing down for any of its operand's logical type for is unsupported in
ExpressionPredicates::toParquetPredicate (#10524)
---
.../org/apache/hudi/source/ExpressionPredicates.java | 6 ++++++
.../apache/hudi/source/TestExpressionPredicates.java | 17 +++++++++++++++++
2 files changed, 23 insertions(+)
diff --git
a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
index 046e4b739ad..34bb58f6c8e 100644
---
a/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
+++
b/hudi-flink-datasource/hudi-flink/src/main/java/org/apache/hudi/source/ExpressionPredicates.java
@@ -548,6 +548,9 @@ public class ExpressionPredicates {
@Override
public FilterPredicate filter() {
+ if (null == predicates[0].filter() || null == predicates[1].filter()) {
+ return null;
+ }
return and(predicates[0].filter(), predicates[1].filter());
}
@@ -586,6 +589,9 @@ public class ExpressionPredicates {
@Override
public FilterPredicate filter() {
+ if (null == predicates[0].filter() || null == predicates[1].filter()) {
+ return null;
+ }
return or(predicates[0].filter(), predicates[1].filter());
}
diff --git
a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
index 97b06644266..b8c4b1caf2e 100644
---
a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
+++
b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/source/TestExpressionPredicates.java
@@ -42,6 +42,7 @@ import
org.apache.parquet.filter2.predicate.Operators.IntColumn;
import org.apache.parquet.filter2.predicate.Operators.Lt;
import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -58,6 +59,7 @@ import static
org.apache.parquet.filter2.predicate.FilterApi.not;
import static org.apache.parquet.filter2.predicate.FilterApi.notEq;
import static org.apache.parquet.filter2.predicate.FilterApi.or;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
/**
* Test cases for {@link ExpressionPredicates}.
@@ -164,4 +166,19 @@ public class TestExpressionPredicates {
assertEquals(predicate19.toString(), predicate20.toString());
assertEquals(or(lt, gt), predicate20.filter());
}
+
+ @Test
+ public void testDisablePredicatesPushDownForUnsupportedType() {
+ FieldReferenceExpression fieldReference = new
FieldReferenceExpression("f_decimal", DataTypes.DECIMAL(7, 2), 0, 0);
+ ValueLiteralExpression valueLiteral = new
ValueLiteralExpression(BigDecimal.valueOf(100.00));
+ List<ResolvedExpression> expressions = Arrays.asList(fieldReference,
valueLiteral);
+
+ CallExpression greaterThanExpression = new
CallExpression(BuiltInFunctionDefinitions.GREATER_THAN, expressions,
DataTypes.DECIMAL(7, 2));
+ Predicate greaterThanPredicate = fromExpression(greaterThanExpression);
+ CallExpression lessThanExpression = new
CallExpression(BuiltInFunctionDefinitions.LESS_THAN, expressions,
DataTypes.DECIMAL(7, 2));
+ Predicate lessThanPredicate = fromExpression(lessThanExpression);
+
+ assertNull(And.getInstance().bindPredicates(greaterThanPredicate,
lessThanPredicate).filter(), "Decimal type push down is unsupported, so we
expect null");
+ assertNull(Or.getInstance().bindPredicates(greaterThanPredicate,
lessThanPredicate).filter(), "Decimal type push down is unsupported, so we
expect null");
+ }
}