Skip to content

Commit a842ab8

Browse files
committed
Fix ColumnArray slicing and single array data constructor
1 parent a685dd5 commit a842ab8

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

clickhouse/columns/array.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55

66
namespace clickhouse {
77

8-
ColumnArray::ColumnArray(ColumnRef data)
9-
: ColumnArray(data, std::make_shared<ColumnUInt64>())
10-
{
8+
namespace {
9+
std::shared_ptr<ColumnUInt64> make_single_offset(size_t value) {
10+
auto res = std::make_shared<ColumnUInt64>();
11+
if (value != 0) {
12+
res->Append(value);
13+
}
14+
return res;
15+
}
16+
} // namespace
17+
18+
ColumnArray::ColumnArray(ColumnRef data) : ColumnArray(data, make_single_offset(data->Size())) {
1119
}
1220

1321
ColumnArray::ColumnArray(ColumnRef data, std::shared_ptr<ColumnUInt64> offsets)
@@ -55,11 +63,15 @@ ColumnRef ColumnArray::Slice(size_t begin, size_t size) const {
5563
if (size && begin + size > Size())
5664
throw ValidationError("Slice indexes are out of bounds");
5765

58-
auto result = std::make_shared<ColumnArray>(data_->Slice(GetOffset(begin), GetOffset(begin + size) - GetOffset(begin)));
59-
for (size_t i = 0; i < size; i++)
60-
result->AddOffset(GetSize(begin + i));
66+
auto sliced_data = data_->Slice(GetOffset(begin), GetOffset(begin + size) - GetOffset(begin));
67+
auto offsets = std::make_shared<ColumnUInt64>();
68+
auto offset = uint64_t{0};
69+
for (size_t i = 0; i < size; i++) {
70+
offset += GetSize(begin + i);
71+
offsets->Append(offset);
72+
}
6173

62-
return result;
74+
return std::make_shared<ColumnArray>(std::move(sliced_data), std::move(offsets));
6375
}
6476

6577
ColumnRef ColumnArray::CloneEmpty() const {

0 commit comments

Comments
 (0)