| 1 | #include "duckdb/parser/query_node/recursive_cte_node.hpp" |
| 2 | #include "duckdb/common/field_writer.hpp" |
| 3 | #include "duckdb/common/serializer/format_serializer.hpp" |
| 4 | #include "duckdb/common/serializer/format_deserializer.hpp" |
| 5 | |
| 6 | namespace duckdb { |
| 7 | |
| 8 | string RecursiveCTENode::ToString() const { |
| 9 | string result; |
| 10 | result += "(" + left->ToString() + ")" ; |
| 11 | result += " UNION " ; |
| 12 | if (union_all) { |
| 13 | result += " ALL " ; |
| 14 | } |
| 15 | result += "(" + right->ToString() + ")" ; |
| 16 | return result; |
| 17 | } |
| 18 | |
| 19 | bool RecursiveCTENode::Equals(const QueryNode *other_p) const { |
| 20 | if (!QueryNode::Equals(other: other_p)) { |
| 21 | return false; |
| 22 | } |
| 23 | if (this == other_p) { |
| 24 | return true; |
| 25 | } |
| 26 | auto &other = other_p->Cast<RecursiveCTENode>(); |
| 27 | |
| 28 | if (other.union_all != union_all) { |
| 29 | return false; |
| 30 | } |
| 31 | if (!left->Equals(other: other.left.get())) { |
| 32 | return false; |
| 33 | } |
| 34 | if (!right->Equals(other: other.right.get())) { |
| 35 | return false; |
| 36 | } |
| 37 | return true; |
| 38 | } |
| 39 | |
| 40 | unique_ptr<QueryNode> RecursiveCTENode::Copy() const { |
| 41 | auto result = make_uniq<RecursiveCTENode>(); |
| 42 | result->ctename = ctename; |
| 43 | result->union_all = union_all; |
| 44 | result->left = left->Copy(); |
| 45 | result->right = right->Copy(); |
| 46 | result->aliases = aliases; |
| 47 | this->CopyProperties(other&: *result); |
| 48 | return std::move(result); |
| 49 | } |
| 50 | |
| 51 | void RecursiveCTENode::Serialize(FieldWriter &writer) const { |
| 52 | writer.WriteString(val: ctename); |
| 53 | writer.WriteField<bool>(element: union_all); |
| 54 | writer.WriteSerializable(element: *left); |
| 55 | writer.WriteSerializable(element: *right); |
| 56 | writer.WriteList<string>(elements: aliases); |
| 57 | } |
| 58 | |
| 59 | unique_ptr<QueryNode> RecursiveCTENode::Deserialize(FieldReader &reader) { |
| 60 | auto result = make_uniq<RecursiveCTENode>(); |
| 61 | result->ctename = reader.ReadRequired<string>(); |
| 62 | result->union_all = reader.ReadRequired<bool>(); |
| 63 | result->left = reader.ReadRequiredSerializable<QueryNode>(); |
| 64 | result->right = reader.ReadRequiredSerializable<QueryNode>(); |
| 65 | result->aliases = reader.ReadRequiredList<string>(); |
| 66 | return std::move(result); |
| 67 | } |
| 68 | |
| 69 | void RecursiveCTENode::FormatSerialize(FormatSerializer &serializer) const { |
| 70 | QueryNode::FormatSerialize(serializer); |
| 71 | serializer.WriteProperty(tag: "cte_name" , value: ctename); |
| 72 | serializer.WriteProperty(tag: "union_all" , value: union_all); |
| 73 | serializer.WriteProperty(tag: "left" , value&: *left); |
| 74 | serializer.WriteProperty(tag: "right" , value&: *right); |
| 75 | serializer.WriteProperty(tag: "aliases" , value: aliases); |
| 76 | } |
| 77 | |
| 78 | unique_ptr<QueryNode> RecursiveCTENode::FormatDeserialize(FormatDeserializer &deserializer) { |
| 79 | auto result = make_uniq<RecursiveCTENode>(); |
| 80 | deserializer.ReadProperty(tag: "cte_name" , ret&: result->ctename); |
| 81 | deserializer.ReadProperty(tag: "union_all" , ret&: result->union_all); |
| 82 | deserializer.ReadProperty(tag: "left" , ret&: result->left); |
| 83 | deserializer.ReadProperty(tag: "right" , ret&: result->right); |
| 84 | deserializer.ReadProperty(tag: "aliases" , ret&: result->aliases); |
| 85 | return std::move(result); |
| 86 | } |
| 87 | |
| 88 | } // namespace duckdb |
| 89 | |