andygrove commented on code in PR #3732:
URL: https://github.com/apache/arrow-datafusion/pull/3732#discussion_r989530437


##########
datafusion/optimizer/src/decorrelate_where_exists.rs:
##########
@@ -137,8 +137,14 @@ fn optimize_exists(
     let subqry_inputs = query_info.query.subquery.inputs();
     let subqry_input = only_or_err(subqry_inputs.as_slice())
         .map_err(|e| context!("single expression projection required", e))?;
-    let subqry_filter = Filter::try_from_plan(subqry_input)
-        .map_err(|e| context!("cannot optimize non-correlated subquery", e))?;
+    let subqry_filter = match subqry_input {

Review Comment:
   I understand what is happening now and have some suggestions for improving 
this rule.
   
   This line of code looks at inputs of the subquery and does not care what 
type of operator the subquery is. Previously this was assumed to be a 
`Projection` but now it could be a `Projection` or a `Distinct`, or something 
else ... I think we should add some pattern matching here.
   
   ```rust
   let subqry_inputs = query_info.query.subquery.inputs();
   ```
   
   We are then matching on this input and previously expected a `Filter` buit 
now could be a `Projection` containing a `Filter` because everything is shifted 
down by one because of the root `Distinct`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to