Skip to content

Commit 130000f

Browse files
jtanxsgrebnov
authored andcommitted
Fix memory leak in duckdb_arrow_scan
1 parent 4630656 commit 130000f

1 file changed

Lines changed: 1 addition & 24 deletions

File tree

src/main/capi/arrow-c.cpp

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -287,30 +287,7 @@ duckdb_state Ingest(duckdb_connection connection, const char *table_name, struct
287287
duckdb_state duckdb_arrow_scan(duckdb_connection connection, const char *table_name, duckdb_arrow_stream arrow) {
288288
auto stream = reinterpret_cast<ArrowArrayStream *>(arrow);
289289

290-
// Backup release functions - we nullify children schema release functions because we don't want to release on
291-
// behalf of the caller, downstream in our code. Note that Arrow releases target immediate children, but aren't
292-
// recursive. So we only back up immediate children here and restore their functions.
293-
ArrowSchema schema;
294-
if (stream->get_schema(stream, &schema) == DuckDBError) {
295-
return DuckDBError;
296-
}
297-
298-
typedef void (*release_fn_t)(ArrowSchema *);
299-
std::vector<release_fn_t> release_fns(duckdb::NumericCast<idx_t>(schema.n_children));
300-
for (idx_t i = 0; i < duckdb::NumericCast<idx_t>(schema.n_children); i++) {
301-
auto child = schema.children[i];
302-
release_fns[i] = child->release;
303-
child->release = arrow_array_stream_wrapper::EmptySchemaRelease;
304-
}
305-
306-
auto ret = arrow_array_stream_wrapper::Ingest(connection, table_name, stream);
307-
308-
// Restore release functions.
309-
for (idx_t i = 0; i < duckdb::NumericCast<idx_t>(schema.n_children); i++) {
310-
schema.children[i]->release = release_fns[i];
311-
}
312-
313-
return ret;
290+
return arrow_array_stream_wrapper::Ingest(connection, table_name, stream);
314291
}
315292

316293
duckdb_state duckdb_arrow_array_scan(duckdb_connection connection, const char *table_name,

0 commit comments

Comments
 (0)