#include #include #include #include #include #include namespace DB { bool ParserSelectWithUnionQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { ASTPtr list_node; ParserList parser(std::make_unique(), std::make_unique("UNION ALL"), false); if (!parser.parse(pos, list_node, expected)) return false; auto select_with_union_query = std::make_shared(); node = select_with_union_query; select_with_union_query->list_of_selects = std::make_shared(); select_with_union_query->children.push_back(select_with_union_query->list_of_selects); // flatten inner union query for (auto & child : list_node->children) getSelectsFromUnionListNode(child, select_with_union_query->list_of_selects->children); return true; } void ParserSelectWithUnionQuery::getSelectsFromUnionListNode(ASTPtr & ast_select, ASTs & selects) { if (ASTSelectWithUnionQuery * inner_union = typeid_cast(ast_select.get())) { for (auto & child : inner_union->list_of_selects->children) getSelectsFromUnionListNode(child, selects); return; } selects.push_back(std::move(ast_select)); } }