forked from ClickHouse/ClickHouse
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgtest_query_tree_node.cpp
More file actions
86 lines (66 loc) · 2.76 KB
/
gtest_query_tree_node.cpp
File metadata and controls
86 lines (66 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <gtest/gtest.h>
#include <DataTypes/DataTypesNumber.h>
#include <Analyzer/Identifier.h>
#include <Analyzer/ColumnNode.h>
#include <Analyzer/ListNode.h>
using namespace DB;
class SourceNode final : public IQueryTreeNode
{
public:
SourceNode() : IQueryTreeNode(0 /*children_size*/) {}
QueryTreeNodeType getNodeType() const override
{
return QueryTreeNodeType::TABLE;
}
void dumpTreeImpl(WriteBuffer &, FormatState &, size_t) const override
{
}
bool isEqualImpl(const IQueryTreeNode &, CompareOptions) const override
{
return true;
}
void updateTreeHashImpl(HashState &, CompareOptions) const override
{
}
QueryTreeNodePtr cloneImpl() const override
{
return std::make_shared<SourceNode>();
}
ASTPtr toASTImpl(const ConvertToASTOptions & /* options */) const override
{
return nullptr;
}
};
TEST(QueryTreeNode, Clone)
{
{
auto source_node = std::make_shared<SourceNode>();
NameAndTypePair column_name_and_type("value", std::make_shared<DataTypeUInt64>());
auto column_node = std::make_shared<ColumnNode>(column_name_and_type, source_node);
ASSERT_EQ(column_node->getColumnSource().get(), source_node.get());
auto cloned_column_node = column_node->clone();
/// If in subtree source was not cloned, source pointer must remain same
ASSERT_NE(column_node.get(), cloned_column_node.get());
ASSERT_EQ(cloned_column_node->as<ColumnNode &>().getColumnSource().get(), source_node.get());
}
{
auto root_node = std::make_shared<ListNode>();
auto source_node = std::make_shared<SourceNode>();
NameAndTypePair column_name_and_type("value", std::make_shared<DataTypeUInt64>());
auto column_node = std::make_shared<ColumnNode>(column_name_and_type, source_node);
root_node->getNodes().push_back(source_node);
root_node->getNodes().push_back(column_node);
ASSERT_EQ(column_node->getColumnSource().get(), source_node.get());
auto cloned_root_node = std::static_pointer_cast<ListNode>(root_node->clone());
auto cloned_source_node = cloned_root_node->getNodes()[0];
auto cloned_column_node = std::static_pointer_cast<ColumnNode>(cloned_root_node->getNodes()[1]);
/** If in subtree source was cloned.
* Source pointer for node that was cloned must remain same.
* Source pointer for cloned node must be updated.
*/
ASSERT_NE(column_node.get(), cloned_column_node.get());
ASSERT_NE(source_node.get(), cloned_source_node.get());
ASSERT_EQ(column_node->getColumnSource().get(), source_node.get());
ASSERT_EQ(cloned_column_node->getColumnSource().get(), cloned_source_node.get());
}
}