Skip to content

Commit 17ddbdb

Browse files
committed
Removed the whole 'clone input data column' thing for ColumnArray
1 parent 3c127a5 commit 17ddbdb

File tree

2 files changed

+29
-31
lines changed

2 files changed

+29
-31
lines changed

clickhouse/columns/array.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,14 @@
55
namespace clickhouse {
66

77
ColumnArray::ColumnArray(ColumnRef data)
8-
: Column(Type::CreateArray(data->Type()))
9-
, data_(data->CloneEmpty())
10-
, offsets_(std::make_shared<ColumnUInt64>())
8+
: ColumnArray(data, std::make_shared<ColumnUInt64>())
119
{
1210
}
1311

14-
ColumnArray::ColumnArray(ColumnRef data, DoNotCloneDataColumnTag)
12+
ColumnArray::ColumnArray(ColumnRef data, std::shared_ptr<ColumnUInt64> offsets)
1513
: Column(Type::CreateArray(data->Type()))
1614
, data_(data)
17-
, offsets_(std::make_shared<ColumnUInt64>())
15+
, offsets_(offsets)
1816
{
1917
}
2018

@@ -48,7 +46,7 @@ ColumnRef ColumnArray::Slice(size_t begin, size_t size) const {
4846
if (size && begin + size > Size())
4947
throw ValidationError("Slice indexes are out of bounds");
5048

51-
auto result = std::make_shared<ColumnArray>(data_->CloneEmpty(), DoNotCloneDataColumnTag{});
49+
auto result = std::make_shared<ColumnArray>(data_->CloneEmpty());
5250
for (size_t i = 0; i < size; i++) {
5351
result->AppendAsColumn(GetAsColumn(begin + i));
5452
}
@@ -57,7 +55,7 @@ ColumnRef ColumnArray::Slice(size_t begin, size_t size) const {
5755
}
5856

5957
ColumnRef ColumnArray::CloneEmpty() const {
60-
return std::make_shared<ColumnArray>(data_->CloneEmpty(), DoNotCloneDataColumnTag{});
58+
return std::make_shared<ColumnArray>(data_->CloneEmpty());
6159
}
6260

6361
void ColumnArray::Append(ColumnRef column) {

clickhouse/columns/array.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,23 @@ class ColumnArrayT;
1414
* Represents column of Array(T).
1515
*/
1616
class ColumnArray : public Column {
17-
protected:
18-
struct DoNotCloneDataColumnTag {};
19-
2017
public:
2118
using ValueType = ColumnRef;
2219

23-
// Create an array of given type, values inside `data` are not taken into account.
20+
/** Create an array of given type.
21+
*
22+
* `data` is used internaly (and modified) by ColumnArray.
23+
* Users are strongly advised against supplying non-empty columns and/or modifying
24+
* contents of `data` afterwards.
25+
*/
2426
explicit ColumnArray(ColumnRef data);
2527

26-
// Not expected to be used by users, hence protected `DoNotCloneDataColumnTag`
27-
ColumnArray(ColumnRef data, DoNotCloneDataColumnTag tag);
28+
/** Create an array of given type, with actual values and offsets.
29+
*
30+
* Both `data` and `offsets` are used (and modified) internally bye ColumnArray.
31+
* Users are strongly advised against modifying contents of `data` or `offsets` afterwards.
32+
*/
33+
ColumnArray(ColumnRef data, std::shared_ptr<ColumnUInt64> offsets);
2834

2935
/// Converts input column to array and appends
3036
/// as one row to the current column.
@@ -37,8 +43,7 @@ class ColumnArray : public Column {
3743
/// Shorthand to get a column casted to a proper type.
3844
template <typename T>
3945
auto GetAsColumnTyped(size_t n) const {
40-
auto result = GetAsColumn(n);
41-
return result->AsStrict<T>();
46+
return GetAsColumn(n)->AsStrict<T>();
4247
}
4348

4449
public:
@@ -80,20 +85,26 @@ class ColumnArray : public Column {
8085
std::shared_ptr<ColumnUInt64> offsets_;
8186
};
8287

83-
template <typename NestedColumnType>
88+
template <typename ColumnType>
8489
class ColumnArrayT : public ColumnArray {
8590
public:
8691
class ArrayValueView;
8792
using ValueType = ArrayValueView;
93+
using NestedColumnType = ColumnType;
8894

8995
explicit ColumnArrayT(std::shared_ptr<NestedColumnType> data)
9096
: ColumnArray(data)
91-
, typed_nested_data_(this->GetData()->template AsStrict<NestedColumnType>())
97+
, typed_nested_data_(data)
98+
{}
99+
100+
ColumnArrayT(std::shared_ptr<NestedColumnType> data, std::shared_ptr<ColumnUInt64> offsets)
101+
: ColumnArray(data, offsets)
102+
, typed_nested_data_(data)
92103
{}
93104

94105
template <typename ...Args>
95106
explicit ColumnArrayT(Args &&... args)
96-
: ColumnArrayT(std::make_shared<NestedColumnType>(std::forward<Args>(args)...), ColumnArray::DoNotCloneDataColumnTag{})
107+
: ColumnArrayT(std::make_shared<NestedColumnType>(std::forward<Args>(args)...))
97108
{}
98109

99110
/** Create a ColumnArrayT from a ColumnArray, without copying data and offsets, but by 'stealing' those from `col`.
@@ -107,14 +118,10 @@ class ColumnArrayT : public ColumnArray {
107118
static auto Wrap(ColumnArray&& col) {
108119
if constexpr (std::is_base_of_v<ColumnArray, NestedColumnType> && !std::is_same_v<ColumnArray, NestedColumnType>) {
109120
// assuming NestedColumnType is ArrayT specialization
110-
111-
auto result = std::make_shared<ColumnArrayT<NestedColumnType>>(NestedColumnType::Wrap(col.GetData()), ColumnArray::DoNotCloneDataColumnTag{});
112-
result->offsets_ = col.offsets_;
113-
114-
return result;
121+
return std::make_shared<ColumnArrayT<NestedColumnType>>(NestedColumnType::Wrap(col.GetData()), col.offsets_);
115122
} else {
116123
auto nested_data = col.GetData()->template AsStrict<NestedColumnType>();
117-
return std::shared_ptr<ColumnArrayT<NestedColumnType>>(new ColumnArrayT<NestedColumnType>(std::move(col), std::move(nested_data)));
124+
return std::make_shared<ColumnArrayT<NestedColumnType>>(nested_data, col.offsets_);
118125
}
119126
}
120127

@@ -255,13 +262,6 @@ class ColumnArrayT : public ColumnArray {
255262
AddOffset(counter);
256263
}
257264

258-
public:
259-
// Helper to allow wrapping 2D-Arrays and also to optimize certain constructors.
260-
ColumnArrayT(std::shared_ptr<NestedColumnType> data, ColumnArray::DoNotCloneDataColumnTag tag)
261-
: ColumnArray(data, tag)
262-
, typed_nested_data_(data)
263-
{}
264-
265265
private:
266266
/// Helper to allow wrapping a "typeless" ColumnArray
267267
ColumnArrayT(ColumnArray&& array, std::shared_ptr<NestedColumnType> nested_data)

0 commit comments

Comments
 (0)