1 | #include "duckdb/parser/tableref/expressionlistref.hpp" |
2 | |
3 | #include "duckdb/common/field_writer.hpp" |
4 | #include "duckdb/common/serializer/format_serializer.hpp" |
5 | #include "duckdb/common/serializer/format_deserializer.hpp" |
6 | |
7 | namespace duckdb { |
8 | |
9 | string ExpressionListRef::ToString() const { |
10 | D_ASSERT(!values.empty()); |
11 | string result = "(VALUES " ; |
12 | for (idx_t row_idx = 0; row_idx < values.size(); row_idx++) { |
13 | if (row_idx > 0) { |
14 | result += ", " ; |
15 | } |
16 | auto &row = values[row_idx]; |
17 | result += "(" ; |
18 | for (idx_t col_idx = 0; col_idx < row.size(); col_idx++) { |
19 | if (col_idx > 0) { |
20 | result += ", " ; |
21 | } |
22 | result += row[col_idx]->ToString(); |
23 | } |
24 | result += ")" ; |
25 | } |
26 | result += ")" ; |
27 | return BaseToString(result, column_name_alias: expected_names); |
28 | } |
29 | |
30 | bool ExpressionListRef::Equals(const TableRef &other_p) const { |
31 | if (!TableRef::Equals(other: other_p)) { |
32 | return false; |
33 | } |
34 | auto &other = other_p.Cast<ExpressionListRef>(); |
35 | if (values.size() != other.values.size()) { |
36 | return false; |
37 | } |
38 | for (idx_t i = 0; i < values.size(); i++) { |
39 | if (values[i].size() != other.values[i].size()) { |
40 | return false; |
41 | } |
42 | for (idx_t j = 0; j < values[i].size(); j++) { |
43 | if (!values[i][j]->Equals(other: *other.values[i][j])) { |
44 | return false; |
45 | } |
46 | } |
47 | } |
48 | return true; |
49 | } |
50 | |
51 | unique_ptr<TableRef> ExpressionListRef::Copy() { |
52 | // value list |
53 | auto result = make_uniq<ExpressionListRef>(); |
54 | for (auto &val_list : values) { |
55 | vector<unique_ptr<ParsedExpression>> new_val_list; |
56 | new_val_list.reserve(n: val_list.size()); |
57 | for (auto &val : val_list) { |
58 | new_val_list.push_back(x: val->Copy()); |
59 | } |
60 | result->values.push_back(x: std::move(new_val_list)); |
61 | } |
62 | result->expected_names = expected_names; |
63 | result->expected_types = expected_types; |
64 | CopyProperties(target&: *result); |
65 | return std::move(result); |
66 | } |
67 | |
68 | void ExpressionListRef::Serialize(FieldWriter &writer) const { |
69 | writer.WriteList<string>(elements: expected_names); |
70 | writer.WriteRegularSerializableList<LogicalType>(elements: expected_types); |
71 | auto &serializer = writer.GetSerializer(); |
72 | writer.WriteField<uint32_t>(element: values.size()); |
73 | for (idx_t i = 0; i < values.size(); i++) { |
74 | serializer.WriteList(list: values[i]); |
75 | } |
76 | } |
77 | |
78 | void ExpressionListRef::FormatSerialize(FormatSerializer &serializer) const { |
79 | TableRef::FormatSerialize(serializer); |
80 | serializer.WriteProperty(tag: "expected_names" , value: expected_names); |
81 | serializer.WriteProperty(tag: "expected_types" , value: expected_types); |
82 | serializer.WriteProperty(tag: "values" , value: values); |
83 | } |
84 | |
85 | unique_ptr<TableRef> ExpressionListRef::FormatDeserialize(FormatDeserializer &source) { |
86 | auto result = make_uniq<ExpressionListRef>(); |
87 | source.ReadProperty(tag: "expected_names" , ret&: result->expected_names); |
88 | source.ReadProperty(tag: "expected_types" , ret&: result->expected_types); |
89 | source.ReadProperty(tag: "values" , ret&: result->values); |
90 | return std::move(result); |
91 | } |
92 | |
93 | unique_ptr<TableRef> ExpressionListRef::Deserialize(FieldReader &reader) { |
94 | auto result = make_uniq<ExpressionListRef>(); |
95 | // value list |
96 | result->expected_names = reader.ReadRequiredList<string>(); |
97 | result->expected_types = reader.ReadRequiredSerializableList<LogicalType, LogicalType>(); |
98 | idx_t value_list_size = reader.ReadRequired<uint32_t>(); |
99 | auto &source = reader.GetSource(); |
100 | for (idx_t i = 0; i < value_list_size; i++) { |
101 | vector<unique_ptr<ParsedExpression>> value_list; |
102 | source.ReadList<ParsedExpression>(list&: value_list); |
103 | result->values.push_back(x: std::move(value_list)); |
104 | } |
105 | return std::move(result); |
106 | } |
107 | |
108 | } // namespace duckdb |
109 | |