|
16 | 16 | // under the License. |
17 | 17 |
|
18 | 18 | use crate::utils::{ |
19 | | - exprs_to_join_cols, find_join_exprs, only_or_err, split_conjunction, |
20 | | - verify_not_disjunction, |
| 19 | + exprs_to_join_cols, find_join_exprs, split_conjunction, verify_not_disjunction, |
21 | 20 | }; |
22 | 21 | use crate::{utils, OptimizerConfig, OptimizerRule}; |
23 | | -use datafusion_common::{context, plan_err}; |
| 22 | +use datafusion_common::{context, plan_err, DataFusionError}; |
24 | 23 | use datafusion_expr::logical_plan::{Filter, JoinType, Subquery}; |
25 | 24 | use datafusion_expr::{combine_filters, Expr, LogicalPlan, LogicalPlanBuilder}; |
26 | 25 | use std::sync::Arc; |
@@ -134,11 +133,23 @@ fn optimize_exists( |
134 | 133 | outer_input: &LogicalPlan, |
135 | 134 | outer_other_exprs: &[Expr], |
136 | 135 | ) -> datafusion_common::Result<LogicalPlan> { |
137 | | - let subqry_inputs = query_info.query.subquery.inputs(); |
138 | | - let subqry_input = only_or_err(subqry_inputs.as_slice()) |
139 | | - .map_err(|e| context!("single expression projection required", e))?; |
140 | | - let subqry_filter = Filter::try_from_plan(subqry_input) |
141 | | - .map_err(|e| context!("cannot optimize non-correlated subquery", e))?; |
| 136 | + let subqry_filter = match query_info.query.subquery.as_ref() { |
| 137 | + LogicalPlan::Distinct(subqry_distinct) => match subqry_distinct.input.as_ref() { |
| 138 | + LogicalPlan::Projection(subqry_proj) => { |
| 139 | + Filter::try_from_plan(&*subqry_proj.input) |
| 140 | + } |
| 141 | + _ => Err(DataFusionError::NotImplemented( |
| 142 | + "Subquery currently only supports distinct or projection".to_string(), |
| 143 | + )), |
| 144 | + }, |
| 145 | + LogicalPlan::Projection(subqry_proj) => { |
| 146 | + Filter::try_from_plan(&*subqry_proj.input) |
| 147 | + } |
| 148 | + _ => Err(DataFusionError::NotImplemented( |
| 149 | + "Subquery currently only supports distinct or projection".to_string(), |
| 150 | + )), |
| 151 | + } |
| 152 | + .map_err(|e| context!("cannot optimize non-correlated subquery", e))?; |
142 | 153 |
|
143 | 154 | // split into filters |
144 | 155 | let mut subqry_filter_exprs = vec![]; |
|
0 commit comments