Hi,

I'm writing a batch of records to a stream and I want to read them later. I
notice that if I use the RecordBatchStreamWriter class to write them and
then ReadRecordBatch function to read them, I get a Segmentation Fault.

On the other hand, if I use the RecordBatchFileWriter class to write them,
the reading works fine.

So, is the arrow::ipc::ReadRecordBatch function intended to only work if
the records were written by RecordBatchFileWriter?

Below is a complete example, showing the two cases. I tried this on Ubuntu
Trusty with Arrow 0.9.0-1

Thanks!
Rares





// g++-4.9 -ggdb -std=c++11 foo.cpp -larrow

#include <arrow/builder.h>
#include <arrow/io/memory.h>
#include <arrow/ipc/reader.h>
#include <arrow/ipc/writer.h>
#include <arrow/memory_pool.h>
#include <arrow/record_batch.h>
#include <arrow/type.h>

int main()
{
    arrow::MemoryPool* pool = arrow::default_memory_pool();

    std::shared_ptr<arrow::PoolBuffer> buffer(new arrow::PoolBuffer(pool));

    arrow::Int64Builder builder(pool);
    builder.Append(1);

    std::shared_ptr<arrow::Array> array;
    builder.Finish(&array);

    std::vector<std::shared_ptr<arrow::Field>> schema_vector =
        {arrow::field("id", arrow::int64())};

    auto schema = std::make_shared<arrow::Schema>(schema_vector);


    // Write
    std::shared_ptr<arrow::RecordBatch> batchOut;
    batchOut = arrow::RecordBatch::Make(schema, 10, {array});

    std::unique_ptr<arrow::io::BufferOutputStream> stream;
    stream.reset(new arrow::io::BufferOutputStream(buffer));

    std::shared_ptr<arrow::ipc::RecordBatchWriter> writer;

    // #1 - Segmentation fault (core dumped)
    arrow::ipc::RecordBatchStreamWriter::Open(stream.get(), schema,
&writer);

    // #2 - OK
    //arrow::ipc::RecordBatchStreamWriter::Open(stream.get(), schema,
&writer);

    writer->WriteRecordBatch(*batchOut);

    writer->Close();
    stream->Close();


    // Read
    arrow::io::BufferReader reader(buffer);
    std::shared_ptr<arrow::RecordBatch> batchIn;
    arrow::ipc::ReadRecordBatch(schema, &reader, &batchIn);
}

Reply via email to