I might be misreading, but do you need to get the address of your object
pointers, `*arrow_schema` and `*arrow_array`? If they're already pointers,
I'm not sure you need to get their address and cast that to a pointer.
otherwise, I don't see anything else that stands out as problematic to me.

You could try to check the Result objects so that you get better error
information before the segfault occurs; as it stands now you're blindly
dereferencing. The other thing that might be helpful is that I think you
don't have to call `new` every time. In all of these instances you are
allocating memory for the objects, but you could just create them directly
and then pass references to them. For example:

   ArrowSchema arrow_schema;
   duckdb_query_arrow_schema(arrow_result, &arrow_schema);
   ...

Since ArrowSchema seems to be default constructible, I believe the
declaration alone will do the default construction (`ArrowSchema
arrow_schema`). But, my cpp knowledge comes and goes, so apologies if those
suggestions aren't accurate.

Aldrin Montana
Computer Science PhD Student
UC Santa Cruz


On Sun, Mar 5, 2023 at 8:56 AM Kimmo Linna <[email protected]> wrote:

> Hi,
>
> I noticed that my previous code worked only for one ArrowArray from
> DuckDB. I change a code this but this is still working only for one
> ArrowArray. The second “loop” causes a segmentation fault. Could someone
> guide me a bit? What should I change to get this work?
>
>
> ArrowSchema *arrow_schema = new ArrowSchema();
> duckdb_query_arrow_schema(arrow_result, (duckdb_arrow_schema *)&
> arrow_schema);
> auto schema = arrow::ImportSchema(arrow_schema);
> auto output_stream = arrow::io::BufferOutputStream::Create();
> auto batch_writer = arrow::ipc::MakeStreamWriter(*output_stream, *schema);
> while (true) {
> ArrowArray *arrow_array = new ArrowArray();
> duckdb_query_arrow_array(arrow_result, (duckdb_arrow_array *)&arrow_array
> );
> if( arrow_array->length > 0) {
> (*batch_writer)->WriteRecordBatch((const arrow::RecordBatch&) **arrow::
> ImportRecordBatch(arrow_array,*schema));
> delete arrow_array;
> }else{
> break;
> }
> }
> auto buffer = (*output_stream)->Finish();
> Best regards,
>
> Kimmo
>
> --
> Kimmo Linna
> Nihtisalontie 3 as 1
> 02630  ESPOO
> [email protected]
> +358 40 590 1074
>
>
>
>

Reply via email to