duckdb / duckdb-rs

Ergonomic bindings to duckdb for Rust

Repository from Github https://github.comduckdb/duckdb-rsRepository from Github https://github.comduckdb/duckdb-rs

Appender support for arrays (or alternative)

cipriancraciun opened this issue · comments

At the moment, although the Value and ValueRef seem to mention support for arrays, lists, and a few related items, none of them seem to be implemented (i.e. the code panics with unsupported!()) when used in Appender::append_row or even for parameter binding in prepared statements.

It would be nice, since DuckDB does support array / list types, to be able to bulk insert data (or at least insert row-by-row) that contains such types.

In the interim, is there perhaps a workaround? (Besides serializing the data as JSON and using COPY, or writing a prepared statement that deserializes data a string via JSON.)

I do not believe there is a function in the C api to append an array or list, but it would require the value to be coverted to a data chunk and then appended with duckdb_append_data_chunk

If you have arrow data, I think it is possible to do this in the current rust api with append_record_batch(), which will convert the record batch to a data chunk and then use duckdb_append_data_chunk.

Looking at the current Rust API (https://docs.rs/duckdb/latest/duckdb/struct.Appender.html?search=batch), I don't see any appender.append_record_batch() method; is this perhaps in a different Rust crate? (I've also checked the libduckdb-sys crate that I believe is the C++ wrapper for Rust.)

It is in the appender-arrow feature here.

I think duckdb_append_value was added in 1.2.0 (duckdb/duckdb#15065). I guess that can be used to append arrays and other types.