You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2024/01/02 15:59:21 UTC
(arrow-datafusion) branch main updated: feat: remove filters with null constants (#8700)
This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new c1fe3dd8f9 feat: remove filters with null constants (#8700)
c1fe3dd8f9 is described below
commit c1fe3dd8f95ab75511c3295e87782373ad060877
Author: Ashim Sedhain <38...@users.noreply.github.com>
AuthorDate: Tue Jan 2 09:59:15 2024 -0600
feat: remove filters with null constants (#8700)
---
datafusion/optimizer/src/eliminate_filter.rs | 33 +++++++++++++++++++++-------
1 file changed, 25 insertions(+), 8 deletions(-)
diff --git a/datafusion/optimizer/src/eliminate_filter.rs b/datafusion/optimizer/src/eliminate_filter.rs
index c97906a81a..fea14342ca 100644
--- a/datafusion/optimizer/src/eliminate_filter.rs
+++ b/datafusion/optimizer/src/eliminate_filter.rs
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-//! Optimizer rule to replace `where false` on a plan with an empty relation.
+//! Optimizer rule to replace `where false or null` on a plan with an empty relation.
//! This saves time in planning and executing the query.
//! Note that this rule should be applied after simplify expressions optimizer rule.
use crate::optimizer::ApplyOrder;
@@ -27,7 +27,7 @@ use datafusion_expr::{
use crate::{OptimizerConfig, OptimizerRule};
-/// Optimization rule that eliminate the scalar value (true/false) filter with an [LogicalPlan::EmptyRelation]
+/// Optimization rule that eliminate the scalar value (true/false/null) filter with an [LogicalPlan::EmptyRelation]
#[derive(Default)]
pub struct EliminateFilter;
@@ -46,20 +46,22 @@ impl OptimizerRule for EliminateFilter {
) -> Result<Option<LogicalPlan>> {
match plan {
LogicalPlan::Filter(Filter {
- predicate: Expr::Literal(ScalarValue::Boolean(Some(v))),
+ predicate: Expr::Literal(ScalarValue::Boolean(v)),
input,
..
}) => {
match *v {
// input also can be filter, apply again
- true => Ok(Some(
+ Some(true) => Ok(Some(
self.try_optimize(input, _config)?
.unwrap_or_else(|| input.as_ref().clone()),
)),
- false => Ok(Some(LogicalPlan::EmptyRelation(EmptyRelation {
- produce_one_row: false,
- schema: input.schema().clone(),
- }))),
+ Some(false) | None => {
+ Ok(Some(LogicalPlan::EmptyRelation(EmptyRelation {
+ produce_one_row: false,
+ schema: input.schema().clone(),
+ })))
+ }
}
}
_ => Ok(None),
@@ -105,6 +107,21 @@ mod tests {
assert_optimized_plan_equal(&plan, expected)
}
+ #[test]
+ fn filter_null() -> Result<()> {
+ let filter_expr = Expr::Literal(ScalarValue::Boolean(None));
+
+ let table_scan = test_table_scan().unwrap();
+ let plan = LogicalPlanBuilder::from(table_scan)
+ .aggregate(vec![col("a")], vec![sum(col("b"))])?
+ .filter(filter_expr)?
+ .build()?;
+
+ // No aggregate / scan / limit
+ let expected = "EmptyRelation";
+ assert_optimized_plan_equal(&plan, expected)
+ }
+
#[test]
fn filter_false_nested() -> Result<()> {
let filter_expr = Expr::Literal(ScalarValue::Boolean(Some(false)));