//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/operator/projection/physical_unnest.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/execution/physical_operator.hpp" #include "duckdb/planner/expression.hpp" namespace duckdb { //! PhysicalUnnest implements the physical UNNEST operation class PhysicalUnnest : public PhysicalOperator { public: static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::UNNEST; public: PhysicalUnnest(vector types, vector> select_list, idx_t estimated_cardinality, PhysicalOperatorType type = PhysicalOperatorType::UNNEST); //! The projection list of the UNNEST //! E.g. SELECT 1, UNNEST([1]), UNNEST([2, 3]); has two UNNESTs in its select_list vector> select_list; public: unique_ptr GetOperatorState(ExecutionContext &context) const override; OperatorResultType Execute(ExecutionContext &context, DataChunk &input, DataChunk &chunk, GlobalOperatorState &gstate, OperatorState &state) const override; bool ParallelOperator() const override { return true; } public: static unique_ptr GetState(ExecutionContext &context, const vector> &select_list); //! Executes the UNNEST operator internally and emits a chunk of unnested data. If include_input is set, then //! the resulting chunk also contains vectors for all non-UNNEST columns in the projection. If include_input is //! not set, then the UNNEST behaves as a table function and only emits the unnested data. static OperatorResultType ExecuteInternal(ExecutionContext &context, DataChunk &input, DataChunk &chunk, OperatorState &state, const vector> &select_list, bool include_input = true); }; } // namespace duckdb