| 1652 | |
| 1653 | |
| 1654 | JoinTreeQueryPlan joinPlansWithStep( |
| 1655 | QueryPlanStepPtr join_step, |
| 1656 | JoinTreeQueryPlan left_join_tree_query_plan, |
| 1657 | JoinTreeQueryPlan right_join_tree_query_plan) |
| 1658 | { |
| 1659 | std::vector<QueryPlanPtr> plans; |
| 1660 | plans.emplace_back(std::make_unique<QueryPlan>(std::move(left_join_tree_query_plan.query_plan))); |
| 1661 | plans.emplace_back(std::make_unique<QueryPlan>(std::move(right_join_tree_query_plan.query_plan))); |
| 1662 | |
| 1663 | QueryPlan result_plan; |
| 1664 | result_plan.unitePlans(std::move(join_step), {std::move(plans)}); |
| 1665 | |
| 1666 | /// Collect all required row_policies and actions sets from left and right join tree query plans |
| 1667 | |
| 1668 | auto result_used_row_policies = std::move(left_join_tree_query_plan.used_row_policies); |
| 1669 | for (const auto & right_join_tree_query_plan_row_policy : right_join_tree_query_plan.used_row_policies) |
| 1670 | result_used_row_policies.insert(right_join_tree_query_plan_row_policy); |
| 1671 | |
| 1672 | auto result_useful_sets = std::move(left_join_tree_query_plan.useful_sets); |
| 1673 | for (const auto & useful_set : right_join_tree_query_plan.useful_sets) |
| 1674 | result_useful_sets.insert(useful_set); |
| 1675 | |
| 1676 | auto result_mapping = std::move(left_join_tree_query_plan.query_node_to_plan_step_mapping); |
| 1677 | const auto & r_mapping = right_join_tree_query_plan.query_node_to_plan_step_mapping; |
| 1678 | result_mapping.insert(r_mapping.begin(), r_mapping.end()); |
| 1679 | |
| 1680 | auto result_source_constants = std::move(left_join_tree_query_plan.source_constants); |
| 1681 | for (const auto & source_constant : right_join_tree_query_plan.source_constants) |
| 1682 | result_source_constants.insert(source_constant); |
| 1683 | |
| 1684 | return JoinTreeQueryPlan{ |
| 1685 | .query_plan = std::move(result_plan), |
| 1686 | .stage = QueryProcessingStage::FetchColumns, |
| 1687 | .used_row_policies = std::move(result_used_row_policies), |
| 1688 | .useful_sets = std::move(result_useful_sets), |
| 1689 | .query_node_to_plan_step_mapping = std::move(result_mapping), |
| 1690 | .source_constants = std::move(result_source_constants), |
| 1691 | }; |
| 1692 | } |
| 1693 | |
| 1694 | JoinTreeQueryPlan buildQueryPlanForCrossJoinNode( |
| 1695 | const QueryTreeNodePtr & join_table_expression, |
no test coverage detected