From e2987e2dad6d3a34066ce7e06760c8ceb86649ff Mon Sep 17 00:00:00 2001 From: "David E. Wheeler" Date: Tue, 11 Nov 2025 13:44:16 -0500 Subject: [PATCH] Add `NewColumn()` to `ColumnArray` Returns a new column of the proper type for inserting new values. Useful for contexts in which the item type isn't immediately known. --- clickhouse/columns/array.cpp | 4 ++++ clickhouse/columns/array.h | 9 +++++++++ ut/column_array_ut.cpp | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) 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);