1 | #include "duckdb/planner/binder.hpp" |
---|---|
2 | |
3 | namespace duckdb { |
4 | |
5 | void Binder::BindNamedParameters(named_parameter_type_map_t &types, named_parameter_map_t &values, |
6 | QueryErrorContext &error_context, string &func_name) { |
7 | for (auto &kv : values) { |
8 | auto entry = types.find(x: kv.first); |
9 | if (entry == types.end()) { |
10 | // create a list of named parameters for the error |
11 | string named_params; |
12 | for (auto &kv : types) { |
13 | named_params += " "; |
14 | named_params += kv.first; |
15 | named_params += " "; |
16 | named_params += kv.second.ToString(); |
17 | named_params += "\n"; |
18 | } |
19 | string error_msg; |
20 | if (named_params.empty()) { |
21 | error_msg = "Function does not accept any named parameters."; |
22 | } else { |
23 | error_msg = "Candidates:\n"+ named_params; |
24 | } |
25 | throw BinderException(error_context.FormatError(msg: "Invalid named parameter \"%s\" for function %s\n%s", |
26 | params: kv.first, params: func_name, params: error_msg)); |
27 | } |
28 | if (entry->second.id() != LogicalTypeId::ANY) { |
29 | kv.second = kv.second.DefaultCastAs(target_type: entry->second); |
30 | } |
31 | } |
32 | } |
33 | |
34 | } // namespace duckdb |
35 |