| 1692 | } |
| 1693 | |
| 1694 | JoinTreeQueryPlan 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 | |
| 1751 | void tryMakeDirectJoinWithMergeTree(const JoinOperator & join_operator, |
no test coverage detected