//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/physical_operator_states.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/catalog/catalog.hpp" #include "duckdb/common/common.hpp" #include "duckdb/common/enums/operator_result_type.hpp" #include "duckdb/common/enums/physical_operator_type.hpp" #include "duckdb/common/types/data_chunk.hpp" #include "duckdb/execution/execution_context.hpp" #include "duckdb/optimizer/join_order/join_node.hpp" namespace duckdb { class Event; class Executor; class PhysicalOperator; class Pipeline; class PipelineBuildState; class MetaPipeline; class InterruptState; struct SourcePartitionInfo { //! The current batch index //! This is only set in case RequiresBatchIndex() is true, and the source has support for it (SupportsBatchIndex()) //! Otherwise this is left on INVALID_INDEX //! The batch index is a globally unique, increasing index that should be used to maintain insertion order //! //! in conjunction with parallelism optional_idx batch_index; //! The minimum batch index that any thread is currently actively reading optional_idx min_batch_index; }; // LCOV_EXCL_START class OperatorState { public: virtual ~OperatorState() { } virtual void Finalize(const PhysicalOperator &op, ExecutionContext &context) { } template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; class GlobalOperatorState { public: virtual ~GlobalOperatorState() { } template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; class GlobalSinkState { public: GlobalSinkState() : state(SinkFinalizeType::READY) { } virtual ~GlobalSinkState() { } SinkFinalizeType state; template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; class LocalSinkState { public: virtual ~LocalSinkState() { } //! Source partition info SourcePartitionInfo partition_info; template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; class GlobalSourceState { public: virtual ~GlobalSourceState() { } virtual idx_t MaxThreads() { return 1; } template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; class LocalSourceState { public: virtual ~LocalSourceState() { } template TARGET &Cast() { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } template const TARGET &Cast() const { D_ASSERT(dynamic_cast(this)); return reinterpret_cast(*this); } }; struct OperatorSinkInput { GlobalSinkState &global_state; LocalSinkState &local_state; InterruptState &interrupt_state; }; struct OperatorSourceInput { GlobalSourceState &global_state; LocalSourceState &local_state; InterruptState &interrupt_state; }; // LCOV_EXCL_STOP } // namespace duckdb