| 185 | } |
| 186 | |
| 187 | QueryTreeNodePtr QueryTreeBuilder::buildSelectWithUnionExpression( |
| 188 | const ASTPtr & select_with_union_query, |
| 189 | bool is_subquery, |
| 190 | const CommonTableExpressionData & cte_data, |
| 191 | const ASTPtr & aliases, |
| 192 | const ContextPtr & context) const |
| 193 | { |
| 194 | auto & select_with_union_query_typed = select_with_union_query->as<ASTSelectWithUnionQuery &>(); |
| 195 | auto & select_lists = select_with_union_query_typed.list_of_selects->as<ASTExpressionList &>(); |
| 196 | |
| 197 | if (select_lists.children.size() == 1) |
| 198 | return buildSelectOrUnionExpression(select_lists.children[0], is_subquery, cte_data, aliases, context); |
| 199 | |
| 200 | auto union_node = std::make_shared<UnionNode>(Context::createCopy(context), select_with_union_query_typed.union_mode); |
| 201 | union_node->setIsSubquery(is_subquery); |
| 202 | union_node->setIsCTE(!cte_data.cte_name.empty()); |
| 203 | union_node->setCTEName(std::string(cte_data.cte_name)); |
| 204 | union_node->setIsMaterialized(cte_data.is_materialized); |
| 205 | union_node->setOriginalAST(select_with_union_query); |
| 206 | |
| 207 | size_t select_lists_children_size = select_lists.children.size(); |
| 208 | |
| 209 | for (size_t i = 0; i < select_lists_children_size; ++i) |
| 210 | { |
| 211 | auto & select_list_node = select_lists.children[i]; |
| 212 | QueryTreeNodePtr query_node = buildSelectOrUnionExpression(select_list_node, false /*is_subquery*/, {} /*cte_name*/, aliases, context); |
| 213 | union_node->getQueries().getNodes().push_back(std::move(query_node)); |
| 214 | } |
| 215 | |
| 216 | return union_node; |
| 217 | } |
| 218 | |
| 219 | QueryTreeNodePtr QueryTreeBuilder::buildSelectIntersectExceptQuery( |
| 220 | const ASTPtr & select_intersect_except_query, |
nothing calls this directly
no test coverage detected