@@ -97,19 +97,28 @@ impl ParquetExec {
97
97
let predicate_creation_errors =
98
98
MetricBuilder :: new ( & metrics) . global_counter ( "num_predicate_creation_errors" ) ;
99
99
100
- let pruning_predicate = predicate. and_then ( |predicate_expr| {
101
- match PruningPredicate :: try_new (
102
- predicate_expr,
103
- base_config. file_schema . clone ( ) ,
104
- ) {
105
- Ok ( pruning_predicate) => Some ( pruning_predicate) ,
106
- Err ( e) => {
107
- debug ! ( "Could not create pruning predicate for: {}" , e) ;
108
- predicate_creation_errors. add ( 1 ) ;
100
+ let pruning_predicate = predicate
101
+ . and_then ( |predicate_expr| {
102
+ match PruningPredicate :: try_new (
103
+ predicate_expr,
104
+ base_config. file_schema . clone ( ) ,
105
+ ) {
106
+ Ok ( pruning_predicate) => Some ( pruning_predicate) ,
107
+ Err ( e) => {
108
+ debug ! ( "Could not create pruning predicate for: {}" , e) ;
109
+ predicate_creation_errors. add ( 1 ) ;
110
+ None
111
+ }
112
+ }
113
+ } )
114
+ . and_then ( |pruning_predicate| {
115
+ // If the pruning predicate can't prune anything, don't try
116
+ if pruning_predicate. allways_true ( ) {
109
117
None
118
+ } else {
119
+ Some ( pruning_predicate)
110
120
}
111
- }
112
- } ) ;
121
+ } ) ;
113
122
114
123
let ( projected_schema, projected_statistics) = base_config. project ( ) ;
115
124
@@ -680,7 +689,7 @@ mod tests {
680
689
use chrono:: { TimeZone , Utc } ;
681
690
use datafusion_common:: assert_contains;
682
691
use datafusion_common:: ScalarValue ;
683
- use datafusion_expr:: { col, lit} ;
692
+ use datafusion_expr:: { col, lit, when } ;
684
693
use futures:: StreamExt ;
685
694
use object_store:: local:: LocalFileSystem ;
686
695
use object_store:: path:: Path ;
@@ -1544,6 +1553,10 @@ mod tests {
1544
1553
1545
1554
let rt = round_trip ( vec ! [ batch1] , None , None , Some ( filter) , true , false ) . await ;
1546
1555
1556
+ // should have a pruning predicate
1557
+ let pruning_predicate = & rt. parquet_exec . pruning_predicate ;
1558
+ assert ! ( pruning_predicate. is_some( ) ) ;
1559
+
1547
1560
// convert to explain plan form
1548
1561
let display = displayable ( rt. parquet_exec . as_ref ( ) ) . indent ( ) . to_string ( ) ;
1549
1562
@@ -1554,6 +1567,37 @@ mod tests {
1554
1567
assert_contains ! ( & display, "projection=[c1]" ) ;
1555
1568
}
1556
1569
1570
+ #[ tokio:: test]
1571
+ async fn parquet_exec_skip_empty_pruning ( ) {
1572
+ let c1: ArrayRef = Arc :: new ( StringArray :: from ( vec ! [
1573
+ Some ( "Foo" ) ,
1574
+ None ,
1575
+ Some ( "bar" ) ,
1576
+ Some ( "bar" ) ,
1577
+ Some ( "bar" ) ,
1578
+ Some ( "bar" ) ,
1579
+ Some ( "zzz" ) ,
1580
+ ] ) ) ;
1581
+
1582
+ // batch1: c1(string)
1583
+ let batch1 = create_batch ( vec ! [ ( "c1" , c1. clone( ) ) ] ) ;
1584
+
1585
+ // filter is too complicated for pruning
1586
+ let filter = when ( col ( "c1" ) . not_eq ( lit ( "bar" ) ) , lit ( true ) )
1587
+ . otherwise ( lit ( false ) )
1588
+ . unwrap ( ) ;
1589
+
1590
+ let rt = round_trip ( vec ! [ batch1] , None , None , Some ( filter) , true , false ) . await ;
1591
+
1592
+ // Should not contain a pruning predicate
1593
+ let pruning_predicate = & rt. parquet_exec . pruning_predicate ;
1594
+ assert ! (
1595
+ pruning_predicate. is_none( ) ,
1596
+ "Still had pruning predicate: {:?}" ,
1597
+ pruning_predicate
1598
+ )
1599
+ }
1600
+
1557
1601
/// returns the sum of all the metrics with the specified name
1558
1602
/// the returned set.
1559
1603
///
0 commit comments