//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/operator/set/physical_recursive_cte.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/types/column/column_data_collection.hpp" #include "duckdb/execution/physical_operator.hpp" namespace duckdb { class RecursiveCTEState; class PhysicalRecursiveCTE : public PhysicalOperator { public: static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::RECURSIVE_CTE; public: PhysicalRecursiveCTE(vector types, bool union_all, unique_ptr top, unique_ptr bottom, idx_t estimated_cardinality); ~PhysicalRecursiveCTE() override; bool union_all; std::shared_ptr working_table; shared_ptr recursive_meta_pipeline; public: // Source interface SourceResultType GetData(ExecutionContext &context, DataChunk &chunk, OperatorSourceInput &input) const override; bool IsSource() const override { return true; } public: // Sink interface SinkResultType Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const override; unique_ptr GetGlobalSinkState(ClientContext &context) const override; bool IsSink() const override { return true; } public: void BuildPipelines(Pipeline ¤t, MetaPipeline &meta_pipeline) override; vector> GetSources() const override; private: //! Probe Hash Table and eliminate duplicate rows idx_t ProbeHT(DataChunk &chunk, RecursiveCTEState &state) const; void ExecuteRecursivePipelines(ExecutionContext &context) const; }; } // namespace duckdb