diff --git a/core/src/segment/Segment.cpp b/core/src/segment/Segment.cpp index 0d572b330a..2d048b255a 100644 --- a/core/src/segment/Segment.cpp +++ b/core/src/segment/Segment.cpp @@ -143,6 +143,9 @@ Segment::AddChunk(const DataChunkPtr& chunk_ptr, int64_t from, int64_t to) { Status Segment::DeleteEntity(std::vector& offsets) { + if (offsets.size() == 0) { + return Status::OK(); + } // sort offset in descendant std::sort(offsets.begin(), offsets.end(), std::greater()); @@ -153,13 +156,23 @@ Segment::DeleteEntity(std::vector& offsets) { continue; } - BinaryDataPtr& data = pair.second; - for (auto offset : offsets) { - if (offset >= 0 && offset < row_count_) { - auto step = offset * width; - data->data_.erase(data->data_.begin() + step, data->data_.begin() + step + width); + auto& data = pair.second->data_; + std::vector marked(data.size(), false); + std::vector temp; + temp.reserve(data.size() - offsets.size() * width); + + for (auto pos = offsets.begin(); pos != offsets.end(); pos++) { + for (auto i = 0; i < width; ++i) { + marked[(*pos) * width + i] = true; } } + + for (size_t i = 0; i < data.size(); i++) { + if (!marked[i]) { + temp.push_back(data[i]); + } + } + data = std::move(temp); } // reset row count