| 1969 | } |
| 1970 | |
| 1971 | JoinTreeQueryPlan buildJoinTreeQueryPlan(const QueryTreeNodePtr & query_node, |
| 1972 | const SelectQueryInfo & select_query_info, |
| 1973 | SelectQueryOptions & select_query_options, |
| 1974 | const ColumnIdentifierSet & outer_scope_columns, |
| 1975 | PlannerContextPtr & planner_context) |
| 1976 | { |
| 1977 | const QueryTreeNodePtr & join_tree_node = query_node->as<QueryNode &>().getJoinTree(); |
| 1978 | auto table_expressions_stack = buildTableExpressionsStack(join_tree_node); |
| 1979 | size_t table_expressions_stack_size = table_expressions_stack.size(); |
| 1980 | bool is_single_table_expression = table_expressions_stack_size == 1; |
| 1981 | |
| 1982 | std::vector<ColumnIdentifierSet> table_expressions_outer_scope_columns(table_expressions_stack_size); |
| 1983 | ColumnIdentifierSet current_outer_scope_columns = outer_scope_columns; |
| 1984 | |
| 1985 | if (is_single_table_expression) |
| 1986 | { |
| 1987 | auto * table_node = table_expressions_stack[0]->as<TableNode>(); |
| 1988 | if (table_node && shouldIgnoreQuotaAndLimits(*table_node)) |
| 1989 | { |
| 1990 | select_query_options.ignore_quota = true; |
| 1991 | select_query_options.ignore_limits = true; |
| 1992 | } |
| 1993 | } |
| 1994 | |
| 1995 | size_t joins_count = 0; |
| 1996 | bool is_full_join = false; |
| 1997 | bool is_global_join = false; |
| 1998 | bool is_right_join_with_remote_table = false; |
| 1999 | int first_join_pos = -1; |
| 2000 | int last_right_join_pos = -1; |
| 2001 | bool is_cross_join = false; |
| 2002 | /// For each table, table function, query, union table expressions prepare before query plan build |
| 2003 | for (size_t i = 0; i < table_expressions_stack_size; ++i) |
| 2004 | { |
| 2005 | const auto & table_expression = table_expressions_stack[i]; |
| 2006 | auto table_expression_type = table_expression->getNodeType(); |
| 2007 | if (table_expression_type == QueryTreeNodeType::ARRAY_JOIN) |
| 2008 | continue; |
| 2009 | |
| 2010 | if (table_expression_type == QueryTreeNodeType::CROSS_JOIN) |
| 2011 | { |
| 2012 | joins_count += table_expression->as<const CrossJoinNode &>().getTableExpressions().size() - 1; |
| 2013 | is_cross_join = true; |
| 2014 | continue; |
| 2015 | } |
| 2016 | |
| 2017 | if (table_expression_type == QueryTreeNodeType::JOIN) |
| 2018 | { |
| 2019 | ++joins_count; |
| 2020 | const auto & join_node = table_expression->as<const JoinNode &>(); |
| 2021 | const auto join_kind = join_node.getKind(); |
| 2022 | |
| 2023 | if (join_kind == JoinKind::Full) |
| 2024 | is_full_join = true; |
| 2025 | |
| 2026 | if (join_node.getLocality() == JoinLocality::Global) |
| 2027 | is_global_join = true; |
| 2028 |
no test coverage detected