| 217 | } |
| 218 | |
| 219 | QueryTreeNodePtr QueryTreeBuilder::buildSelectIntersectExceptQuery( |
| 220 | const ASTPtr & select_intersect_except_query, |
| 221 | bool is_subquery, |
| 222 | const CommonTableExpressionData & cte_data, |
| 223 | const ContextPtr & context) const |
| 224 | { |
| 225 | auto & select_intersect_except_query_typed = select_intersect_except_query->as<ASTSelectIntersectExceptQuery &>(); |
| 226 | auto select_lists = select_intersect_except_query_typed.getListOfSelects(); |
| 227 | |
| 228 | if (select_lists.size() == 1) |
| 229 | return buildSelectExpression(select_lists[0], is_subquery, cte_data, nullptr /*aliases*/, context); |
| 230 | |
| 231 | SelectUnionMode union_mode = {}; |
| 232 | if (select_intersect_except_query_typed.final_operator == ASTSelectIntersectExceptQuery::Operator::INTERSECT_ALL) |
| 233 | union_mode = SelectUnionMode::INTERSECT_ALL; |
| 234 | else if (select_intersect_except_query_typed.final_operator == ASTSelectIntersectExceptQuery::Operator::INTERSECT_DISTINCT) |
| 235 | union_mode = SelectUnionMode::INTERSECT_DISTINCT; |
| 236 | else if (select_intersect_except_query_typed.final_operator == ASTSelectIntersectExceptQuery::Operator::EXCEPT_ALL) |
| 237 | union_mode = SelectUnionMode::EXCEPT_ALL; |
| 238 | else if (select_intersect_except_query_typed.final_operator == ASTSelectIntersectExceptQuery::Operator::EXCEPT_DISTINCT) |
| 239 | union_mode = SelectUnionMode::EXCEPT_DISTINCT; |
| 240 | else |
| 241 | throw Exception(ErrorCodes::LOGICAL_ERROR, "UNION type is not initialized"); |
| 242 | |
| 243 | auto union_node = std::make_shared<UnionNode>(Context::createCopy(context), union_mode); |
| 244 | union_node->setIsSubquery(is_subquery); |
| 245 | union_node->setIsCTE(!cte_data.cte_name.empty()); |
| 246 | union_node->setCTEName(std::string(cte_data.cte_name)); |
| 247 | union_node->setIsMaterialized(cte_data.is_materialized); |
| 248 | union_node->setOriginalAST(select_intersect_except_query); |
| 249 | |
| 250 | size_t select_lists_size = select_lists.size(); |
| 251 | |
| 252 | for (size_t i = 0; i < select_lists_size; ++i) |
| 253 | { |
| 254 | auto & select_list_node = select_lists[i]; |
| 255 | QueryTreeNodePtr query_node = buildSelectOrUnionExpression(select_list_node, false /*is_subquery*/, {} /*cte_name*/, nullptr /*aliases*/, context); |
| 256 | union_node->getQueries().getNodes().push_back(std::move(query_node)); |
| 257 | } |
| 258 | |
| 259 | return union_node; |
| 260 | } |
| 261 | |
| 262 | QueryTreeNodePtr QueryTreeBuilder::buildSelectExpression( |
| 263 | const ASTPtr & select_query, |
nothing calls this directly
no test coverage detected