MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / buildSelectIntersectExceptQuery

Method buildSelectIntersectExceptQuery

src/Analyzer/QueryTreeBuilder.cpp:219–260  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

217}
218
219QueryTreeNodePtr 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
262QueryTreeNodePtr QueryTreeBuilder::buildSelectExpression(
263 const ASTPtr & select_query,

Callers

nothing calls this directly

Calls 11

getListOfSelectsMethod · 0.80
setOriginalASTMethod · 0.80
getNodesMethod · 0.80
ExceptionClass · 0.50
sizeMethod · 0.45
setIsSubqueryMethod · 0.45
setIsCTEMethod · 0.45
emptyMethod · 0.45
setCTENameMethod · 0.45
setIsMaterializedMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected