| 393 | |
| 394 | impl PullUpCorrelatedExpr { |
| 395 | fn collect_missing_exprs( |
| 396 | &self, |
| 397 | exprs: &[Expr], |
| 398 | correlated_subquery_cols: &BTreeSet<Column>, |
| 399 | ) -> Result<Vec<Expr>> { |
| 400 | let mut missing_exprs = vec![]; |
| 401 | for expr in exprs { |
| 402 | if !missing_exprs.contains(expr) { |
| 403 | missing_exprs.push(expr.clone()) |
| 404 | } |
| 405 | } |
| 406 | for col in correlated_subquery_cols.iter() { |
| 407 | let col_expr = Expr::Column(col.clone()); |
| 408 | if !missing_exprs.contains(&col_expr) { |
| 409 | missing_exprs.push(col_expr) |
| 410 | } |
| 411 | } |
| 412 | if let Some(pull_up_having) = &self.pull_up_having_expr { |
| 413 | let filter_apply_columns = pull_up_having.column_refs(); |
| 414 | for col in filter_apply_columns { |
| 415 | // add to missing_exprs if not already there |
| 416 | let contains = missing_exprs |
| 417 | .iter() |
| 418 | .any(|expr| matches!(expr, Expr::Column(c) if c == col)); |
| 419 | if !contains { |
| 420 | missing_exprs.push(Expr::Column(col.clone())) |
| 421 | } |
| 422 | } |
| 423 | } |
| 424 | Ok(missing_exprs) |
| 425 | } |
| 426 | } |
| 427 | |
| 428 | fn can_pullup_over_aggregation(expr: &Expr) -> bool { |