Skip to content

Commit 06b9466

Browse files
Merge pull request #7791 from DimasKovas/fix_insert_in_pod_array
Fix PODArray.insert
2 parents 63e0e38 + 87c6a63 commit 06b9466

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

dbms/src/Common/PODArray.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,11 +430,11 @@ class PODArray : public PODArrayBase<sizeof(T), initial_bytes, TAllocator, pad_r
430430
template <typename It1, typename It2>
431431
void insert(iterator it, It1 from_begin, It2 from_end)
432432
{
433-
insertPrepare(from_begin, from_end);
434-
435433
size_t bytes_to_copy = this->byte_size(from_end - from_begin);
436434
size_t bytes_to_move = (end() - it) * sizeof(T);
437435

436+
insertPrepare(from_begin, from_end);
437+
438438
if (unlikely(bytes_to_move))
439439
memcpy(this->c_end + bytes_to_copy - bytes_to_move, this->c_end - bytes_to_move, bytes_to_move);
440440

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <gtest/gtest.h>
2+
3+
#include <Common/PODArray.h>
4+
5+
using namespace DB;
6+
7+
TEST(Common, PODArray_Insert)
8+
{
9+
std::string str = "test_string_abacaba";
10+
PODArray<char> chars;
11+
chars.insert(chars.end(), str.begin(), str.end());
12+
EXPECT_EQ(str, std::string(chars.data(), chars.size()));
13+
14+
std::string insert_in_the_middle = "insert_in_the_middle";
15+
auto pos = str.size() / 2;
16+
str.insert(str.begin() + pos, insert_in_the_middle.begin(), insert_in_the_middle.end());
17+
chars.insert(chars.begin() + pos, insert_in_the_middle.begin(), insert_in_the_middle.end());
18+
EXPECT_EQ(str, std::string(chars.data(), chars.size()));
19+
20+
std::string insert_with_resize;
21+
insert_with_resize.reserve(chars.capacity() * 2);
22+
char cur_char = 'a';
23+
while (insert_with_resize.size() < insert_with_resize.capacity())
24+
{
25+
insert_with_resize += cur_char;
26+
if (cur_char == 'z')
27+
cur_char = 'a';
28+
else
29+
++cur_char;
30+
}
31+
str.insert(str.begin(), insert_with_resize.begin(), insert_with_resize.end());
32+
chars.insert(chars.begin(), insert_with_resize.begin(), insert_with_resize.end());
33+
EXPECT_EQ(str, std::string(chars.data(), chars.size()));
34+
}

0 commit comments

Comments
 (0)