This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/master by this push:
     new a49e01e9c Remove unreachable from filter push down rule (#3342)
a49e01e9c is described below

commit a49e01e9c51d1f291573dcacada87511be4bfec4
Author: Andy Grove <[email protected]>
AuthorDate: Fri Sep 2 15:20:11 2022 -0600

    Remove unreachable from filter push down rule (#3342)
---
 datafusion/optimizer/src/filter_push_down.rs | 49 +++++++++++++++-------------
 1 file changed, 27 insertions(+), 22 deletions(-)

diff --git a/datafusion/optimizer/src/filter_push_down.rs 
b/datafusion/optimizer/src/filter_push_down.rs
index d5dafad4a..1d5386f46 100644
--- a/datafusion/optimizer/src/filter_push_down.rs
+++ b/datafusion/optimizer/src/filter_push_down.rs
@@ -15,7 +15,7 @@
 //! Filter Push Down optimizer rule ensures that filters are applied as early 
as possible in the plan
 
 use crate::{utils, OptimizerConfig, OptimizerRule};
-use datafusion_common::{Column, DFSchema, Result};
+use datafusion_common::{Column, DFSchema, DataFusionError, Result};
 use datafusion_expr::{
     col,
     expr_rewriter::{replace_col, ExprRewritable, ExprRewriter},
@@ -165,41 +165,46 @@ fn issue_filters(
 // non-preserved side it can be more tricky.
 //
 // Returns a tuple of booleans - (left_preserved, right_preserved).
-fn lr_is_preserved(plan: &LogicalPlan) -> (bool, bool) {
+fn lr_is_preserved(plan: &LogicalPlan) -> Result<(bool, bool)> {
     match plan {
         LogicalPlan::Join(Join { join_type, .. }) => match join_type {
-            JoinType::Inner => (true, true),
-            JoinType::Left => (true, false),
-            JoinType::Right => (false, true),
-            JoinType::Full => (false, false),
+            JoinType::Inner => Ok((true, true)),
+            JoinType::Left => Ok((true, false)),
+            JoinType::Right => Ok((false, true)),
+            JoinType::Full => Ok((false, false)),
             // No columns from the right side of the join can be referenced in 
output
             // predicates for semi/anti joins, so whether we specify t/f 
doesn't matter.
-            JoinType::Semi | JoinType::Anti => (true, false),
+            JoinType::Semi | JoinType::Anti => Ok((true, false)),
         },
-        LogicalPlan::CrossJoin(_) => (true, true),
-        _ => unreachable!("lr_is_preserved only valid for JOIN nodes"),
+        LogicalPlan::CrossJoin(_) => Ok((true, true)),
+        _ => Err(DataFusionError::Internal(
+            "lr_is_preserved only valid for JOIN nodes".to_string(),
+        )),
     }
 }
 
 // For a given JOIN logical plan, determine whether each side of the join is 
preserved
 // in terms on join filtering.
 // Predicates from join filter can only be pushed to preserved join side.
-fn on_lr_is_preserved(plan: &LogicalPlan) -> (bool, bool) {
+fn on_lr_is_preserved(plan: &LogicalPlan) -> Result<(bool, bool)> {
     match plan {
         LogicalPlan::Join(Join { join_type, .. }) => match join_type {
-            JoinType::Inner => (true, true),
-            JoinType::Left => (false, true),
-            JoinType::Right => (true, false),
-            JoinType::Full => (false, false),
+            JoinType::Inner => Ok((true, true)),
+            JoinType::Left => Ok((false, true)),
+            JoinType::Right => Ok((true, false)),
+            JoinType::Full => Ok((false, false)),
             // Semi/Anti joins can not have join filter.
-            JoinType::Semi | JoinType::Anti => unreachable!(
+            JoinType::Semi | JoinType::Anti => Err(DataFusionError::Internal(
                 "on_lr_is_preserved cannot be appplied to SEMI/ANTI-JOIN nodes"
-            ),
+                    .to_string(),
+            )),
         },
-        LogicalPlan::CrossJoin(_) => {
-            unreachable!("on_lr_is_preserved cannot be applied to CROSSJOIN 
nodes")
-        }
-        _ => unreachable!("on_lr_is_preserved only valid for JOIN nodes"),
+        LogicalPlan::CrossJoin(_) => Err(DataFusionError::Internal(
+            "on_lr_is_preserved cannot be applied to CROSSJOIN 
nodes".to_string(),
+        )),
+        _ => Err(DataFusionError::Internal(
+            "on_lr_is_preserved only valid for JOIN nodes".to_string(),
+        )),
     }
 }
 
@@ -251,7 +256,7 @@ fn optimize_join(
     on_filter: Vec<Predicate>,
 ) -> Result<LogicalPlan> {
     // Get pushable predicates from current optimizer state
-    let (left_preserved, right_preserved) = lr_is_preserved(plan);
+    let (left_preserved, right_preserved) = lr_is_preserved(plan)?;
     let to_left =
         get_pushable_join_predicates(&state.filters, left.schema(), 
left_preserved);
     let to_right =
@@ -267,7 +272,7 @@ fn optimize_join(
     let (on_to_left, on_to_right, on_to_keep) = if on_filter.is_empty() {
         ((vec![], vec![]), (vec![], vec![]), vec![])
     } else {
-        let (on_left_preserved, on_right_preserved) = on_lr_is_preserved(plan);
+        let (on_left_preserved, on_right_preserved) = 
on_lr_is_preserved(plan)?;
         let on_to_left =
             get_pushable_join_predicates(&on_filter, left.schema(), 
on_left_preserved);
         let on_to_right =

Reply via email to