//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/expression_executor_state.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/common.hpp" #include "duckdb/common/types/data_chunk.hpp" #include "duckdb/common/cycle_counter.hpp" #include "duckdb/function/function.hpp" namespace duckdb { class Expression; class ExpressionExecutor; struct ExpressionExecutorState; struct FunctionLocalState; struct ExpressionState { ExpressionState(const Expression &expr, ExpressionExecutorState &root); virtual ~ExpressionState() { } const Expression &expr; ExpressionExecutorState &root; vector> child_states; vector types; DataChunk intermediate_chunk; CycleCounter profiler; public: void AddChild(Expression *expr); void Finalize(); Allocator &GetAllocator(); bool HasContext(); DUCKDB_API ClientContext &GetContext(); void Verify(ExpressionExecutorState &root); public: 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 ExecuteFunctionState : public ExpressionState { ExecuteFunctionState(const Expression &expr, ExpressionExecutorState &root); ~ExecuteFunctionState(); unique_ptr local_state; public: static optional_ptr GetFunctionState(ExpressionState &state) { return state.Cast().local_state.get(); } }; struct ExpressionExecutorState { ExpressionExecutorState(); unique_ptr root_state; ExpressionExecutor *executor = nullptr; CycleCounter profiler; void Verify(); }; } // namespace duckdb