diff --git a/internal/core/src/storage/parquet_c.cpp b/internal/core/src/storage/parquet_c.cpp index a5bbeb052a..75f50e9ae7 100644 --- a/internal/core/src/storage/parquet_c.cpp +++ b/internal/core/src/storage/parquet_c.cpp @@ -305,6 +305,12 @@ FinishPayloadWriter(CPayloadWriter payloadWriter) { st.error_msg = nullptr; auto p = reinterpret_cast(payloadWriter); if (p->builder == nullptr) { + if (p->dimension == wrapper::EMPTY_DIMENSION) { + // For FloatVector/BinaryVector datatype, the builder is lazily inited. + // Since wrapper::EMPTY_DIMENSION indicates the builder is not inited, + // we simply return success here. + return st; + } st.error_code = static_cast(ErrorCode::UNEXPECTED_ERROR); st.error_msg = ErrorMsg("arrow builder is nullptr"); return st; diff --git a/internal/core/unittest/test_parquet_c.cpp b/internal/core/unittest/test_parquet_c.cpp index 7eee474f7d..a1007c0bc3 100644 --- a/internal/core/unittest/test_parquet_c.cpp +++ b/internal/core/unittest/test_parquet_c.cpp @@ -248,6 +248,21 @@ TEST(wrapper, binary_vector) { ReleasePayloadReader(reader); } +TEST(wrapper, binary_vector_empty) { + auto payload = NewPayloadWriter(ColumnType::VECTOR_BINARY); + auto st = FinishPayloadWriter(payload); + ASSERT_EQ(st.error_code, ErrorCode::SUCCESS); + auto cb = GetPayloadBufferFromWriter(payload); + ASSERT_EQ(cb.length, 0); + ASSERT_EQ(cb.data, nullptr); + auto nums = GetPayloadLengthFromWriter(payload); + ASSERT_EQ(nums, 0); + auto reader = NewPayloadReader(ColumnType::VECTOR_BINARY, (uint8_t*)cb.data, cb.length); + ASSERT_EQ(reader, nullptr); + ReleasePayloadWriter(payload); + ReleasePayloadReader(reader); +} + TEST(wrapper, float_vector) { auto payload = NewPayloadWriter(ColumnType::VECTOR_FLOAT); float data[] = {1, 2, 3, 4, 5, 6, 7, 8}; @@ -282,6 +297,21 @@ TEST(wrapper, float_vector) { ReleasePayloadReader(reader); } +TEST(wrapper, float_vector_empty) { + auto payload = NewPayloadWriter(ColumnType::VECTOR_FLOAT); + auto st = FinishPayloadWriter(payload); + ASSERT_EQ(st.error_code, ErrorCode::SUCCESS); + auto cb = GetPayloadBufferFromWriter(payload); + ASSERT_EQ(cb.length, 0); + ASSERT_EQ(cb.data, nullptr); + auto nums = GetPayloadLengthFromWriter(payload); + ASSERT_EQ(nums, 0); + auto reader = NewPayloadReader(ColumnType::VECTOR_FLOAT, (uint8_t*)cb.data, cb.length); + ASSERT_EQ(reader, nullptr); + ReleasePayloadWriter(payload); + ReleasePayloadReader(reader); +} + TEST(wrapper, int8_2) { auto payload = NewPayloadWriter(ColumnType::INT8); int8_t data[] = {-1, 1, -100, 100}; diff --git a/internal/storage/payload_cgo_test.go b/internal/storage/payload_cgo_test.go index 1b2caae494..8730609e00 100644 --- a/internal/storage/payload_cgo_test.go +++ b/internal/storage/payload_cgo_test.go @@ -583,7 +583,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { assert.NotNil(t, err) err = w.FinishPayloadWriter() - assert.NotNil(t, err) + assert.Nil(t, err) err = w.AddBinaryVectorToPayload([]byte{}, 8) assert.NotNil(t, err) @@ -604,7 +604,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { defer w.Close() err = w.FinishPayloadWriter() - assert.NotNil(t, err) + assert.Nil(t, err) err = w.AddFloatVectorToPayload([]float32{}, 8) assert.NotNil(t, err) diff --git a/internal/storage/payload_test.go b/internal/storage/payload_test.go index 89615b82bd..fa648ff3be 100644 --- a/internal/storage/payload_test.go +++ b/internal/storage/payload_test.go @@ -583,7 +583,7 @@ func TestPayload_ReaderAndWriter(t *testing.T) { assert.NotNil(t, err) err = w.FinishPayloadWriter() - assert.NotNil(t, err) + assert.Nil(t, err) err = w.AddBinaryVectorToPayload([]byte{}, 8) assert.NotNil(t, err) @@ -604,7 +604,7 @@ func TestPayload_ReaderAndWriter(t *testing.T) { defer w.Close() err = w.FinishPayloadWriter() - assert.NotNil(t, err) + assert.Nil(t, err) err = w.AddFloatVectorToPayload([]float32{}, 8) assert.NotNil(t, err)