1#include "duckdb/planner/operator/logical_unnest.hpp"
2
3#include "duckdb/common/field_writer.hpp"
4#include "duckdb/main/config.hpp"
5
6namespace duckdb {
7
8vector<ColumnBinding> LogicalUnnest::GetColumnBindings() {
9 auto child_bindings = children[0]->GetColumnBindings();
10 for (idx_t i = 0; i < expressions.size(); i++) {
11 child_bindings.emplace_back(args&: unnest_index, args&: i);
12 }
13 return child_bindings;
14}
15
16void LogicalUnnest::ResolveTypes() {
17 types.insert(position: types.end(), first: children[0]->types.begin(), last: children[0]->types.end());
18 for (auto &expr : expressions) {
19 types.push_back(x: expr->return_type);
20 }
21}
22
23void LogicalUnnest::Serialize(FieldWriter &writer) const {
24 writer.WriteField(element: unnest_index);
25 writer.WriteSerializableList<Expression>(elements: expressions);
26}
27
28unique_ptr<LogicalOperator> LogicalUnnest::Deserialize(LogicalDeserializationState &state, FieldReader &reader) {
29 auto unnest_index = reader.ReadRequired<idx_t>();
30 auto expressions = reader.ReadRequiredSerializableList<Expression>(args&: state.gstate);
31 auto result = make_uniq<LogicalUnnest>(args&: unnest_index);
32 result->expressions = std::move(expressions);
33 return std::move(result);
34}
35
36vector<idx_t> LogicalUnnest::GetTableIndex() const {
37 return vector<idx_t> {unnest_index};
38}
39
40string LogicalUnnest::GetName() const {
41#ifdef DEBUG
42 if (DBConfigOptions::debug_print_bindings) {
43 return LogicalOperator::GetName() + StringUtil::Format(" #%llu", unnest_index);
44 }
45#endif
46 return LogicalOperator::GetName();
47}
48
49} // namespace duckdb
50