@@ -99,7 +99,7 @@ static void OverrideNullType(vector<LogicalType> &return_types, const vector<Ide
9999}
100100
101101unique_ptr<FunctionData> BindExplicitSchema (unique_ptr<MapFunctionData> function_data, PyObject *schema_p,
102- vector<LogicalType> &types, vector<Identifier > &names) {
102+ vector<LogicalType> &types, vector<string > &names) {
103103 D_ASSERT (schema_p != Py_None);
104104
105105 auto schema_object = py::reinterpret_borrow<py::dict>(schema_p);
@@ -115,13 +115,15 @@ unique_ptr<FunctionData> BindExplicitSchema(unique_ptr<MapFunctionData> function
115115 for (auto &item : schema) {
116116 auto name = item.first ;
117117 auto type_p = item.second ;
118- names.push_back (Identifier (py::str (name)));
118+ names.push_back (string (py::str (name)));
119119 // TODO: replace with py::try_cast so we can catch the error and throw a better exception
120120 auto type = py::cast<shared_ptr<DuckDBPyType>>(type_p);
121121 types.push_back (type->Type ());
122122 }
123123
124- function_data->out_names = names;
124+ for (auto &name : names) {
125+ function_data->out_names .push_back (Identifier (name));
126+ }
125127 function_data->out_types = types;
126128
127129 return std::move (function_data);
@@ -141,18 +143,19 @@ unique_ptr<FunctionData> MapFunction::MapFunctionBind(ClientContext &context, Ta
141143 data.in_names = input.input_table_names ;
142144 data.in_types = input.input_table_types ;
143145
144- vector<Identifier> name_identifiers (names.size ());
145- std::transform (names.begin (), names.end (), name_identifiers.begin (),
146- [](const string &name) { return Identifier (name); });
147-
148146 if (explicit_schema != Py_None) {
149- return BindExplicitSchema (std::move (data_uptr), explicit_schema, return_types, name_identifiers );
147+ return BindExplicitSchema (std::move (data_uptr), explicit_schema, return_types, names );
150148 }
151149 NumpyResultConversion conversion (data.in_types , 0 , context.GetClientProperties ());
152150 auto df = FunctionCall (conversion, data.in_names , data.function );
153151 vector<PandasColumnBindData> pandas_bind_data; // unused
154152 Pandas::Bind (context, df, pandas_bind_data, return_types, names);
155153
154+ // Build the Identifier names only after Pandas::Bind has populated 'names'.
155+ vector<Identifier> name_identifiers (names.size ());
156+ std::transform (names.begin (), names.end (), name_identifiers.begin (),
157+ [](const string &name) { return Identifier (name); });
158+
156159 // output types are potentially NULL, this happens for types that map to 'object' dtype
157160 OverrideNullType (return_types, name_identifiers, data.in_types , data.in_names );
158161
0 commit comments