| 1 | #include "duckdb/planner/expression.hpp" |
| 2 | |
| 3 | #include "duckdb/common/exception.hpp" |
| 4 | #include "duckdb/common/types/hash.hpp" |
| 5 | #include "duckdb/planner/expression_iterator.hpp" |
| 6 | |
| 7 | using namespace duckdb; |
| 8 | using namespace std; |
| 9 | |
| 10 | Expression::Expression(ExpressionType type, ExpressionClass expression_class, TypeId return_type) |
| 11 | : BaseExpression(type, expression_class), return_type(return_type) { |
| 12 | } |
| 13 | |
| 14 | bool Expression::IsAggregate() const { |
| 15 | bool is_aggregate = false; |
| 16 | ExpressionIterator::EnumerateChildren(*this, [&](const Expression &child) { is_aggregate |= child.IsAggregate(); }); |
| 17 | return is_aggregate; |
| 18 | } |
| 19 | |
| 20 | bool Expression::IsWindow() const { |
| 21 | bool is_window = false; |
| 22 | ExpressionIterator::EnumerateChildren(*this, [&](const Expression &child) { is_window |= child.IsWindow(); }); |
| 23 | return is_window; |
| 24 | } |
| 25 | |
| 26 | bool Expression::IsScalar() const { |
| 27 | bool is_scalar = true; |
| 28 | ExpressionIterator::EnumerateChildren(*this, [&](const Expression &child) { |
| 29 | if (!child.IsScalar()) { |
| 30 | is_scalar = false; |
| 31 | } |
| 32 | }); |
| 33 | return is_scalar; |
| 34 | } |
| 35 | |
| 36 | bool Expression::IsFoldable() const { |
| 37 | bool is_foldable = true; |
| 38 | ExpressionIterator::EnumerateChildren(*this, [&](const Expression &child) { |
| 39 | if (!child.IsFoldable()) { |
| 40 | is_foldable = false; |
| 41 | } |
| 42 | }); |
| 43 | return is_foldable; |
| 44 | } |
| 45 | |
| 46 | bool Expression::HasParameter() const { |
| 47 | bool has_parameter = false; |
| 48 | ExpressionIterator::EnumerateChildren(*this, |
| 49 | [&](const Expression &child) { has_parameter |= child.HasParameter(); }); |
| 50 | return has_parameter; |
| 51 | } |
| 52 | |
| 53 | bool Expression::HasSubquery() const { |
| 54 | bool has_subquery = false; |
| 55 | ExpressionIterator::EnumerateChildren(*this, [&](const Expression &child) { has_subquery |= child.HasSubquery(); }); |
| 56 | return has_subquery; |
| 57 | } |
| 58 | |
| 59 | hash_t Expression::Hash() const { |
| 60 | hash_t hash = duckdb::Hash<uint32_t>((uint32_t)type); |
| 61 | hash = CombineHash(hash, duckdb::Hash<uint32_t>((uint32_t)return_type)); |
| 62 | ExpressionIterator::EnumerateChildren(*this, |
| 63 | [&](const Expression &child) { hash = CombineHash(child.Hash(), hash); }); |
| 64 | return hash; |
| 65 | } |
| 66 | |