Skip to content

Commit 0ff9762

Browse files
committed
fix identifier <-> name conversion
1 parent 289a9e3 commit 0ff9762

1 file changed

Lines changed: 11 additions & 8 deletions

File tree

src/duckdb_py/map.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static void OverrideNullType(vector<LogicalType> &return_types, const vector<Ide
9999
}
100100

101101
unique_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

Comments
 (0)