1 | #include "duckdb/parser/expression/cast_expression.hpp" |
---|---|
2 | #include "duckdb/planner/expression/bound_cast_expression.hpp" |
3 | #include "duckdb/planner/expression/bound_parameter_expression.hpp" |
4 | #include "duckdb/planner/expression_binder.hpp" |
5 | #include "duckdb/planner/binder.hpp" |
6 | |
7 | namespace duckdb { |
8 | |
9 | BindResult ExpressionBinder::BindExpression(CastExpression &expr, idx_t depth) { |
10 | // first try to bind the child of the cast expression |
11 | string error = Bind(expr&: expr.child, depth); |
12 | if (!error.empty()) { |
13 | return BindResult(error); |
14 | } |
15 | // FIXME: We can also implement 'hello'::schema.custom_type; and pass by the schema down here. |
16 | // Right now just considering its DEFAULT_SCHEMA always |
17 | Binder::BindLogicalType(context, type&: expr.cast_type); |
18 | // the children have been successfully resolved |
19 | auto &child = BoundExpression::GetExpression(expr&: *expr.child); |
20 | if (expr.try_cast) { |
21 | if (child->return_type == expr.cast_type) { |
22 | // no cast required: type matches |
23 | return BindResult(std::move(child)); |
24 | } |
25 | child = BoundCastExpression::AddCastToType(context, expr: std::move(child), target_type: expr.cast_type, try_cast: true); |
26 | } else { |
27 | // otherwise add a cast to the target type |
28 | child = BoundCastExpression::AddCastToType(context, expr: std::move(child), target_type: expr.cast_type); |
29 | } |
30 | return BindResult(std::move(child)); |
31 | } |
32 | } // namespace duckdb |
33 |