@@ -31,13 +31,13 @@ use crate::{
31
31
metrics:: { BaselineMetrics , ExecutionPlanMetricsSet , MetricsSet } ,
32
32
DisplayFormatType , ExecutionPlan ,
33
33
} ;
34
-
35
34
use arrow:: compute:: filter_record_batch;
36
35
use arrow:: datatypes:: { DataType , SchemaRef } ;
37
36
use arrow:: record_batch:: RecordBatch ;
38
- use datafusion_common:: cast:: as_boolean_array;
37
+ use arrow_array:: { Array , BooleanArray } ;
38
+ use datafusion_common:: cast:: { as_boolean_array, as_null_array} ;
39
39
use datafusion_common:: stats:: Precision ;
40
- use datafusion_common:: { plan_err, DataFusionError , Result } ;
40
+ use datafusion_common:: { internal_err , plan_err, DataFusionError , Result } ;
41
41
use datafusion_execution:: TaskContext ;
42
42
use datafusion_expr:: Operator ;
43
43
use datafusion_physical_expr:: expressions:: BinaryExpr ;
@@ -84,6 +84,19 @@ impl FilterExec {
84
84
cache,
85
85
} )
86
86
}
87
+ DataType :: Null => {
88
+ let default_selectivity = 0 ;
89
+ let cache =
90
+ Self :: compute_properties ( & input, & predicate, default_selectivity) ?;
91
+
92
+ Ok ( Self {
93
+ predicate,
94
+ input : input. clone ( ) ,
95
+ metrics : ExecutionPlanMetricsSet :: new ( ) ,
96
+ default_selectivity,
97
+ cache,
98
+ } )
99
+ }
87
100
other => {
88
101
plan_err ! ( "Filter predicate must return boolean values, not {other:?}" )
89
102
}
@@ -355,9 +368,23 @@ pub(crate) fn batch_filter(
355
368
. evaluate ( batch)
356
369
. and_then ( |v| v. into_array ( batch. num_rows ( ) ) )
357
370
. and_then ( |array| {
358
- Ok ( as_boolean_array ( & array) ?)
359
- // apply filter array to record batch
360
- . and_then ( |filter_array| Ok ( filter_record_batch ( batch, filter_array) ?) )
371
+ let filter_array = match as_boolean_array ( & array) {
372
+ Ok ( boolean_array) => {
373
+ Ok ( boolean_array. to_owned ( ) )
374
+ } ,
375
+ Err ( _) => {
376
+ let Ok ( null_array) = as_null_array ( & array) else {
377
+ return internal_err ! ( "Cannot create filter_array from non-boolean predicates, unable to continute" ) ;
378
+ } ;
379
+
380
+ // if the predicate is null, then the result is also null
381
+ Ok :: < BooleanArray , DataFusionError > ( BooleanArray :: new_null (
382
+ null_array. len ( ) ,
383
+ ) )
384
+ }
385
+ } ?;
386
+
387
+ Ok ( filter_record_batch ( batch, & filter_array) ?)
361
388
} )
362
389
}
363
390
0 commit comments