//===----------------------------------------------------------------------===// // DuckDB // // duckdb/planner/bound_result_modifier.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/limits.hpp" #include "duckdb/parser/result_modifier.hpp" #include "duckdb/planner/bound_statement.hpp" #include "duckdb/planner/expression.hpp" #include "duckdb/storage/statistics/base_statistics.hpp" namespace duckdb { //! A ResultModifier class BoundResultModifier { public: explicit BoundResultModifier(ResultModifierType type); virtual ~BoundResultModifier(); ResultModifierType type; public: template TARGET &Cast() { if (type != TARGET::TYPE) { throw InternalException("Failed to cast result modifier to type - result modifier type mismatch"); } return reinterpret_cast(*this); } template const TARGET &Cast() const { if (type != TARGET::TYPE) { throw InternalException("Failed to cast result modifier to type - result modifier type mismatch"); } return reinterpret_cast(*this); } }; struct BoundOrderByNode { public: static constexpr const ResultModifierType TYPE = ResultModifierType::ORDER_MODIFIER; public: BoundOrderByNode(OrderType type, OrderByNullType null_order, unique_ptr expression); BoundOrderByNode(OrderType type, OrderByNullType null_order, unique_ptr expression, unique_ptr stats); OrderType type; OrderByNullType null_order; unique_ptr expression; unique_ptr stats; public: BoundOrderByNode Copy() const; bool Equals(const BoundOrderByNode &other) const; string ToString() const; void Serialize(Serializer &serializer) const; static BoundOrderByNode Deserialize(Deserializer &source, PlanDeserializationState &state); }; class BoundLimitModifier : public BoundResultModifier { public: static constexpr const ResultModifierType TYPE = ResultModifierType::LIMIT_MODIFIER; public: BoundLimitModifier(); //! LIMIT int64_t limit_val = NumericLimits::Maximum(); //! OFFSET int64_t offset_val = 0; //! Expression in case limit is not constant unique_ptr limit; //! Expression in case limit is not constant unique_ptr offset; }; class BoundOrderModifier : public BoundResultModifier { public: static constexpr const ResultModifierType TYPE = ResultModifierType::ORDER_MODIFIER; public: BoundOrderModifier(); //! List of order nodes vector orders; unique_ptr Copy() const; static bool Equals(const BoundOrderModifier &left, const BoundOrderModifier &right); static bool Equals(const unique_ptr &left, const unique_ptr &right); void Serialize(Serializer &serializer) const; static unique_ptr Deserialize(Deserializer &source, PlanDeserializationState &state); }; enum class DistinctType : uint8_t { DISTINCT = 0, DISTINCT_ON = 1 }; class BoundDistinctModifier : public BoundResultModifier { public: static constexpr const ResultModifierType TYPE = ResultModifierType::DISTINCT_MODIFIER; public: BoundDistinctModifier(); //! Whether or not this is a DISTINCT or DISTINCT ON DistinctType distinct_type; //! list of distinct on targets vector> target_distincts; }; class BoundLimitPercentModifier : public BoundResultModifier { public: static constexpr const ResultModifierType TYPE = ResultModifierType::LIMIT_PERCENT_MODIFIER; public: BoundLimitPercentModifier(); //! LIMIT % double limit_percent = 100.0; //! OFFSET int64_t offset_val = 0; //! Expression in case limit is not constant unique_ptr limit; //! Expression in case limit is not constant unique_ptr offset; }; } // namespace duckdb