diff --git a/clickhouse/columns/array.cpp b/clickhouse/columns/array.cpp index 94163c4d..edd10d81 100644 --- a/clickhouse/columns/array.cpp +++ b/clickhouse/columns/array.cpp @@ -59,6 +59,10 @@ ColumnRef ColumnArray::GetAsColumn(size_t n) const { return data_->Slice(GetOffset(n), GetSize(n)); } +ColumnRef ColumnArray::NewColumn() const { + return data_->CloneEmpty(); +} + ColumnRef ColumnArray::Slice(size_t begin, size_t size) const { if (size && begin + size > Size()) throw ValidationError("Slice indexes are out of bounds"); diff --git a/clickhouse/columns/array.h b/clickhouse/columns/array.h index 3ad9c94d..b38aab62 100644 --- a/clickhouse/columns/array.h +++ b/clickhouse/columns/array.h @@ -46,6 +46,15 @@ class ColumnArray : public Column { return GetAsColumn(n)->AsStrict(); } + /// Create a new, empty column of the same type as the array element. + ColumnRef NewColumn() const; + + /// Shorthand to create a new column casted to a proper type. + template + auto NewColumnAsType() const { + return NewColumn()->AsStrict(); + } + public: /// Increase the capacity of the column for large block insertion. void Reserve(size_t new_cap) override; diff --git a/ut/column_array_ut.cpp b/ut/column_array_ut.cpp index 6fe0bd19..0dc1ae64 100644 --- a/ut/column_array_ut.cpp +++ b/ut/column_array_ut.cpp @@ -53,7 +53,7 @@ TEST(ColumnArray, Append) { auto arr1 = std::make_shared(std::make_shared()); auto arr2 = std::make_shared(std::make_shared()); - auto id = std::make_shared(); + auto id = arr1->NewColumnAsType(); id->Append(1); arr1->AppendAsColumn(id);