diff --git a/be/src/olap/rowset/segment_v2/column_writer.cpp b/be/src/olap/rowset/segment_v2/column_writer.cpp index 62170aa4d0..1ba59bf2ad 100644 --- a/be/src/olap/rowset/segment_v2/column_writer.cpp +++ b/be/src/olap/rowset/segment_v2/column_writer.cpp @@ -332,9 +332,11 @@ Status ColumnWriter::_finish_current_page() { OwnedSlice nullmap; if (_is_nullable && _null_bitmap_builder->has_null()) { nullmap = _null_bitmap_builder->finish(); - _null_bitmap_builder->reset(); body.push_back(nullmap.slice()); } + if (_null_bitmap_builder != nullptr) { + _null_bitmap_builder->reset(); + } // prepare data page footer std::unique_ptr page(new Page()); diff --git a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp index a67a4f6565..c8f6820cd9 100644 --- a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp +++ b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp @@ -313,6 +313,20 @@ TEST_F(ColumnReaderWriterTest, test_nullable) { test_nullable_data(val, is_null, num_uint8_rows / 8, "null_bigint_bs"); test_nullable_data(val, is_null, num_uint8_rows / 16, "null_largeint_bs"); + // test for the case where most values are not null + uint8_t* is_null_sparse = new uint8_t[num_uint8_rows]; + for (int i = 0; i < num_uint8_rows; ++i) { + bool v = false; + // in order to make some data pages not null, set the first half of values not null. + // for the second half, only 1/1024 of values are null + if (i >= (num_uint8_rows / 2)) { + v = (i % 1024) == 10; + } + BitmapChange(is_null_sparse, i, v); + } + test_nullable_data(val, is_null_sparse, num_uint8_rows, "sparse_null_tiny_bs"); + + float* float_vals = new float[num_uint8_rows]; for (int i = 0; i < num_uint8_rows; ++i) { float_vals[i] = i; @@ -330,6 +344,7 @@ TEST_F(ColumnReaderWriterTest, test_nullable) { // test_nullable_data(val, is_null, num_uint8_rows / 8, "null_double_bs"); delete[] val; delete[] is_null; + delete[] is_null_sparse; delete[] float_vals; delete[] double_vals; }