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

Function buildQueryPlanForCrossJoinNode

src/Planner/PlannerJoinTree.cpp:1694–1749  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1692}
1693
1694JoinTreeQueryPlan buildQueryPlanForCrossJoinNode(
1695 const QueryTreeNodePtr & join_table_expression,
1696 std::vector<JoinTreeQueryPlan> plans,
1697 const ColumnIdentifierSet & outer_scope_columns,
1698 PlannerContextPtr & planner_context)
1699{
1700 auto & cross_join_node = join_table_expression->as<CrossJoinNode &>();
1701 for (const auto & plan : plans)
1702 {
1703 if (plan.stage != QueryProcessingStage::FetchColumns)
1704 throw Exception(ErrorCodes::UNSUPPORTED_METHOD,
1705 "JOIN {} table expression expected to process query to fetch columns stage. Actual {}",
1706 cross_join_node.formatASTForErrorMessage(),
1707 QueryProcessingStage::toString(plan.stage));
1708 }
1709
1710 const auto & query_context = planner_context->getQueryContext();
1711 const auto & settings = query_context->getSettingsRef();
1712
1713 const auto & table_expressions = cross_join_node.getTableExpressions();
1714 bool display_internal_aliases = settings[Setting::query_plan_display_internal_aliases];
1715
1716 auto left_join_tree_query_plan = std::move(plans[0]);
1717 auto left_table_label = getQueryDisplayLabel(table_expressions.at(0), display_internal_aliases);
1718
1719 for (size_t i = 1; i < plans.size(); ++i)
1720 {
1721 auto right_join_tree_query_plan = std::move(plans[i]);
1722
1723 const auto & left_header = left_join_tree_query_plan.query_plan.getCurrentHeader();
1724 const auto & right_header = right_join_tree_query_plan.query_plan.getCurrentHeader();
1725 JoinExpressionActions join_expression_actions(*left_header, *right_header);
1726 auto join_step_logical = std::make_unique<JoinStepLogical>(
1727 left_header,
1728 right_header,
1729 JoinOperator{JoinKind::Cross},
1730 std::move(join_expression_actions),
1731 outer_scope_columns,
1732 std::unordered_map<String, const ActionsDAG::Node *>{},
1733 settings[Setting::join_use_nulls],
1734 JoinSettings(settings),
1735 SortingStep::Settings(settings));
1736
1737 auto right_table_label = getQueryDisplayLabel(table_expressions.at(i), display_internal_aliases);
1738 join_step_logical->setInputLabels(std::move(left_table_label), std::move(right_table_label));
1739 left_table_label = join_step_logical->getReadableRelationName();
1740
1741 appendSetsFromActionsDAG(join_step_logical->getActionsDAG(), left_join_tree_query_plan.useful_sets);
1742 left_join_tree_query_plan = joinPlansWithStep(
1743 std::move(join_step_logical),
1744 std::move(left_join_tree_query_plan),
1745 std::move(right_join_tree_query_plan));
1746 }
1747
1748 return left_join_tree_query_plan;
1749}
1750
1751void tryMakeDirectJoinWithMergeTree(const JoinOperator & join_operator,

Callers 1

buildJoinTreeQueryPlanFunction · 0.85

Calls 14

getQueryDisplayLabelFunction · 0.85
JoinSettingsClass · 0.85
appendSetsFromActionsDAGFunction · 0.85
joinPlansWithStepFunction · 0.85
setInputLabelsMethod · 0.80
ExceptionClass · 0.50
toStringFunction · 0.50
SettingsClass · 0.50
getQueryContextMethod · 0.45
atMethod · 0.45

Tested by

no test coverage detected