| 1 | #include "duckdb/planner/subquery/has_correlated_expressions.hpp" |
|---|---|
| 2 | |
| 3 | #include "duckdb/planner/expression/bound_columnref_expression.hpp" |
| 4 | #include "duckdb/planner/expression/bound_subquery_expression.hpp" |
| 5 | |
| 6 | using namespace duckdb; |
| 7 | using namespace std; |
| 8 | |
| 9 | HasCorrelatedExpressions::HasCorrelatedExpressions(const vector<CorrelatedColumnInfo> &correlated) |
| 10 | : has_correlated_expressions(false), correlated_columns(correlated) { |
| 11 | } |
| 12 | |
| 13 | void HasCorrelatedExpressions::VisitOperator(LogicalOperator &op) { |
| 14 | //! The HasCorrelatedExpressions does not recursively visit logical operators, it only visits the current one |
| 15 | VisitOperatorExpressions(op); |
| 16 | } |
| 17 | |
| 18 | unique_ptr<Expression> HasCorrelatedExpressions::VisitReplace(BoundColumnRefExpression &expr, |
| 19 | unique_ptr<Expression> *expr_ptr) { |
| 20 | if (expr.depth == 0) { |
| 21 | return nullptr; |
| 22 | } |
| 23 | // correlated column reference |
| 24 | assert(expr.depth == 1); |
| 25 | has_correlated_expressions = true; |
| 26 | return nullptr; |
| 27 | } |
| 28 | |
| 29 | unique_ptr<Expression> HasCorrelatedExpressions::VisitReplace(BoundSubqueryExpression &expr, |
| 30 | unique_ptr<Expression> *expr_ptr) { |
| 31 | if (!expr.IsCorrelated()) { |
| 32 | return nullptr; |
| 33 | } |
| 34 | // check if the subquery contains any of the correlated expressions that we are concerned about in this node |
| 35 | for (idx_t i = 0; i < correlated_columns.size(); i++) { |
| 36 | if (std::find(expr.binder->correlated_columns.begin(), expr.binder->correlated_columns.end(), |
| 37 | correlated_columns[i]) != expr.binder->correlated_columns.end()) { |
| 38 | has_correlated_expressions = true; |
| 39 | break; |
| 40 | } |
| 41 | } |
| 42 | return nullptr; |
| 43 | } |
| 44 |