| 746 | { |
| 747 | |
| 748 | void buildTableExpressionsStackImpl(const QueryTreeNodePtr & join_tree_node, QueryTreeNodes & result) |
| 749 | { |
| 750 | auto node_type = join_tree_node->getNodeType(); |
| 751 | |
| 752 | switch (node_type) |
| 753 | { |
| 754 | case QueryTreeNodeType::TABLE: |
| 755 | [[fallthrough]]; |
| 756 | case QueryTreeNodeType::QUERY: |
| 757 | [[fallthrough]]; |
| 758 | case QueryTreeNodeType::UNION: |
| 759 | [[fallthrough]]; |
| 760 | case QueryTreeNodeType::TABLE_FUNCTION: |
| 761 | { |
| 762 | result.push_back(join_tree_node); |
| 763 | break; |
| 764 | } |
| 765 | case QueryTreeNodeType::ARRAY_JOIN: |
| 766 | { |
| 767 | auto & array_join_node = join_tree_node->as<ArrayJoinNode &>(); |
| 768 | buildTableExpressionsStackImpl(array_join_node.getTableExpression(), result); |
| 769 | result.push_back(join_tree_node); |
| 770 | break; |
| 771 | } |
| 772 | case QueryTreeNodeType::CROSS_JOIN: |
| 773 | { |
| 774 | auto & cross_join_node = join_tree_node->as<CrossJoinNode &>(); |
| 775 | |
| 776 | for (const auto & expr : cross_join_node.getTableExpressions()) |
| 777 | buildTableExpressionsStackImpl(expr, result); |
| 778 | |
| 779 | result.push_back(join_tree_node); |
| 780 | break; |
| 781 | } |
| 782 | case QueryTreeNodeType::JOIN: |
| 783 | { |
| 784 | auto & join_node = join_tree_node->as<JoinNode &>(); |
| 785 | buildTableExpressionsStackImpl(join_node.getLeftTableExpression(), result); |
| 786 | buildTableExpressionsStackImpl(join_node.getRightTableExpression(), result); |
| 787 | result.push_back(join_tree_node); |
| 788 | break; |
| 789 | } |
| 790 | default: |
| 791 | { |
| 792 | throw Exception(ErrorCodes::LOGICAL_ERROR, |
| 793 | "Unexpected node type for table expression. Expected table, table function, query, union, join or array join. Actual {}", |
| 794 | join_tree_node->getNodeTypeName()); |
| 795 | } |
| 796 | } |
| 797 | } |
| 798 | |
| 799 | } |
| 800 |
no test coverage detected