ClickHouse/src/Analyzer/UnionNode.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

160 lines
4.1 KiB
C++
Raw Normal View History

2022-08-23 09:50:02 +00:00
#pragma once
2022-08-31 15:21:17 +00:00
#include <Core/NamesAndTypes.h>
#include <Core/Field.h>
2022-12-06 09:44:38 +00:00
#include <Parsers/SelectUnionMode.h>
2022-08-23 09:50:02 +00:00
#include <Analyzer/Identifier.h>
#include <Analyzer/IQueryTreeNode.h>
#include <Analyzer/ListNode.h>
#include <Analyzer/TableExpressionModifiers.h>
2022-08-23 09:50:02 +00:00
2022-12-06 09:44:38 +00:00
#include <Interpreters/Context_fwd.h>
2022-08-23 09:50:02 +00:00
namespace DB
{
/** Union node represents union of queries in query tree.
* Union node must be initialized with normalized union mode.
2022-10-17 17:46:30 +00:00
*
* Example: (SELECT id FROM test_table) UNION ALL (SELECT id FROM test_table_2);
* Example: (SELECT id FROM test_table) UNION DISTINCT (SELECT id FROM test_table_2);
* Example: (SELECT id FROM test_table) EXCEPT ALL (SELECT id FROM test_table_2);
* Example: (SELECT id FROM test_table) EXCEPT DISTINCT (SELECT id FROM test_table_2);
* Example: (SELECT id FROM test_table) INTERSECT ALL (SELECT id FROM test_table_2);
* Example: (SELECT id FROM test_table) INTERSECT DISTINCT (SELECT id FROM test_table_2);
*
2022-10-19 10:25:27 +00:00
* Union node can be used as CTE.
* Example: WITH cte_subquery AS ((SELECT id FROM test_table) UNION ALL (SELECT id FROM test_table_2)) SELECT * FROM cte_subquery;
*
* Union node can be used as scalar subquery.
* Example: SELECT (SELECT 1 UNION DISTINCT SELECT 1);
*
2022-10-17 17:46:30 +00:00
* During query analysis pass union node queries must be resolved.
2022-08-23 09:50:02 +00:00
*/
class UnionNode;
using UnionNodePtr = std::shared_ptr<UnionNode>;
class UnionNode final : public IQueryTreeNode
{
public:
2022-12-06 09:44:38 +00:00
/// Construct union node with context and normalized union mode
explicit UnionNode(ContextMutablePtr context_, SelectUnionMode union_mode_);
/// Get context
ContextPtr getContext() const
{
return context;
}
/// Get mutable context
const ContextMutablePtr & getMutableContext() const
{
return context;
}
/// Get mutable context
ContextMutablePtr & getMutableContext()
{
return context;
}
2022-08-23 09:50:02 +00:00
2022-10-17 17:46:30 +00:00
/// Returns true if union node is subquery, false otherwise
2022-08-23 09:50:02 +00:00
bool isSubquery() const
{
return is_subquery;
}
2022-10-17 17:46:30 +00:00
/// Set union node is subquery value
2022-08-23 09:50:02 +00:00
void setIsSubquery(bool is_subquery_value)
{
is_subquery = is_subquery_value;
}
2022-10-17 17:46:30 +00:00
/// Returns true if union node is CTE, false otherwise
2022-08-23 09:50:02 +00:00
bool isCTE() const
{
return is_cte;
}
2022-10-17 17:46:30 +00:00
/// Set union node is CTE
2022-08-23 09:50:02 +00:00
void setIsCTE(bool is_cte_value)
{
is_cte = is_cte_value;
}
2022-10-17 17:46:30 +00:00
/// Get union node CTE name
2022-08-23 09:50:02 +00:00
const std::string & getCTEName() const
{
return cte_name;
}
2022-10-17 17:46:30 +00:00
/// Set union node CTE name
2022-08-23 09:50:02 +00:00
void setCTEName(std::string cte_name_value)
{
cte_name = std::move(cte_name_value);
}
2022-10-17 17:46:30 +00:00
/// Get union mode
2022-08-23 09:50:02 +00:00
SelectUnionMode getUnionMode() const
{
return union_mode;
}
2022-10-17 17:46:30 +00:00
/// Get union node queries
const ListNode & getQueries() const
2022-08-23 09:50:02 +00:00
{
2022-10-17 17:46:30 +00:00
return children[queries_child_index]->as<const ListNode &>();
2022-08-23 09:50:02 +00:00
}
2022-10-17 17:46:30 +00:00
/// Get union node queries
ListNode & getQueries()
2022-08-23 09:50:02 +00:00
{
2022-10-17 17:46:30 +00:00
return children[queries_child_index]->as<ListNode &>();
2022-08-23 09:50:02 +00:00
}
2022-10-17 17:46:30 +00:00
/// Get union node queries node
const QueryTreeNodePtr & getQueriesNode() const
2022-08-23 09:50:02 +00:00
{
2022-10-17 17:46:30 +00:00
return children[queries_child_index];
2022-08-23 09:50:02 +00:00
}
2022-10-17 17:46:30 +00:00
/// Get union node queries node
QueryTreeNodePtr & getQueriesNode()
2022-08-23 09:50:02 +00:00
{
2022-10-17 17:46:30 +00:00
return children[queries_child_index];
2022-08-23 09:50:02 +00:00
}
2022-10-17 17:46:30 +00:00
/// Compute union node projection columns
2022-08-31 15:21:17 +00:00
NamesAndTypes computeProjectionColumns() const;
2022-08-23 09:50:02 +00:00
QueryTreeNodeType getNodeType() const override
{
return QueryTreeNodeType::UNION;
}
void dumpTreeImpl(WriteBuffer & buffer, FormatState & format_state, size_t indent) const override;
protected:
2022-08-23 09:50:02 +00:00
bool isEqualImpl(const IQueryTreeNode & rhs) const override;
void updateTreeHashImpl(HashState &) const override;
QueryTreeNodePtr cloneImpl() const override;
ASTPtr toASTImpl() const override;
2022-08-23 09:50:02 +00:00
private:
bool is_subquery = false;
bool is_cte = false;
std::string cte_name;
2022-12-06 09:44:38 +00:00
ContextMutablePtr context;
2022-08-23 09:50:02 +00:00
SelectUnionMode union_mode;
static constexpr size_t queries_child_index = 0;
static constexpr size_t children_size = queries_child_index + 1;
};
}