MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / buildJoinTreeQueryPlan

Function buildJoinTreeQueryPlan

src/Planner/PlannerJoinTree.cpp:1971–2240  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1969}
1970
1971JoinTreeQueryPlan 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

Callers 1

buildPlanForQueryNodeMethod · 0.85

Calls 15

getLocalityMethod · 0.80
ExceptionClass · 0.50
sizeMethod · 0.45
getNodeTypeMethod · 0.45

Tested by

no test coverage detected