Skip to content

Commit a26c2df

Browse files
committed
Add IColumn::capacity
Signed-off-by: JaySon-Huang <[email protected]>
1 parent b19f538 commit a26c2df

40 files changed

+260
-85
lines changed

dbms/src/Columns/ColumnAggregateFunction.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class ColumnAggregateFunction final : public COWPtrHelper<IColumn, ColumnAggrega
9898
{}
9999

100100
public:
101-
~ColumnAggregateFunction();
101+
~ColumnAggregateFunction() override;
102102

103103
void set(const AggregateFunctionPtr & func_) { func = func_; }
104104

@@ -328,6 +328,8 @@ class ColumnAggregateFunction final : public COWPtrHelper<IColumn, ColumnAggrega
328328

329329
void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override;
330330

331+
size_t capacity() const override { return data.capacity(); }
332+
331333
/** More efficient manipulation methods */
332334
Container & getData() { return data; }
333335

dbms/src/Columns/ColumnArray.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -620,11 +620,19 @@ struct Less
620620
} // namespace
621621

622622

623-
void ColumnArray::reserve(size_t n)
623+
void ColumnArray::reserveWithStrategy(size_t n, ReserveStrategy strategy)
624624
{
625-
getOffsets().reserve(n);
625+
switch (strategy)
626+
{
627+
case ReserveStrategy::Default:
628+
getOffsets().reserve(n);
629+
break;
630+
case ReserveStrategy::ScaleFactor1_5:
631+
getOffsets().reserve(n / 2 * 3);
632+
break;
633+
}
626634
/// The average size of arrays is not taken into account here. Or it is considered to be no more than 1.
627-
getData().reserve(n);
635+
getData().reserveWithStrategy(n, strategy);
628636
}
629637

630638
void ColumnArray::reserveAlign(size_t n, size_t alignment)

dbms/src/Columns/ColumnArray.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ class ColumnArray final : public COWPtrHelper<IColumn, ColumnArray>
214214
ColumnPtr permute(const Permutation & perm, size_t limit) const override;
215215
int compareAt(size_t n, size_t m, const IColumn & rhs_, int nan_direction_hint) const override;
216216
void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override;
217-
void reserve(size_t n) override;
217+
size_t capacity() const override { return data->capacity(); }
218+
void reserveWithStrategy(size_t n, ReserveStrategy strategy) override;
218219
void reserveAlign(size_t n, size_t alignment) override;
219220
size_t byteSize() const override;
220221
size_t byteSize(size_t offset, size_t limit) const override;

dbms/src/Columns/ColumnConst.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ class ColumnConst final : public COWPtrHelper<IColumn, ColumnConst>
261261
ColumnPtr permute(const Permutation & perm, size_t limit) const override;
262262
void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override;
263263

264+
size_t capacity() const override { return data->capacity(); }
265+
264266
size_t byteSize() const override { return data->byteSize() + sizeof(s); }
265267

266268
size_t byteSize(size_t /*offset*/, size_t /*limit*/) const override { return byteSize(); }

dbms/src/Columns/ColumnDecimal.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,20 @@ MutableColumnPtr ColumnDecimal<T>::cloneResized(size_t size) const
764764
return res;
765765
}
766766

767+
template <typename T>
768+
void ColumnDecimal<T>::reserveWithStrategy(size_t n, IColumn::ReserveStrategy strategy)
769+
{
770+
switch (strategy)
771+
{
772+
case IColumn::ReserveStrategy::Default:
773+
data.reserve(n);
774+
break;
775+
case IColumn::ReserveStrategy::ScaleFactor1_5:
776+
data.reserve_exact(n / 2 * 3);
777+
break;
778+
}
779+
}
780+
767781
template <typename T>
768782
void ColumnDecimal<T>::insertData(const char * src [[maybe_unused]], size_t /*length*/)
769783
{

dbms/src/Columns/ColumnDecimal.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,9 @@ class ColumnDecimal final : public COWPtrHelper<ColumnVectorHelper, ColumnDecima
113113
size_t byteSize() const override { return data.size() * sizeof(data[0]); }
114114
size_t byteSize(size_t /*offset*/, size_t limit) const override { return limit * sizeof(data[0]); }
115115
size_t allocatedBytes() const override { return data.allocated_bytes(); }
116-
//void protect() override { data.protect(); }
117-
void reserve(size_t n) override { data.reserve(n); }
116+
117+
size_t capacity() const override { return data.capacity(); }
118+
void reserveWithStrategy(size_t n, IColumn::ReserveStrategy strategy) override;
118119
void reserveAlign(size_t n, size_t alignment) override { data.reserve(n, alignment); }
119120

120121
void insertFrom(const IColumn & src, size_t n) override

dbms/src/Columns/ColumnFixedString.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,19 @@ void ColumnFixedString::gather(ColumnGathererStream & gatherer)
681681
gatherer.gather(*this);
682682
}
683683

684+
void ColumnFixedString::reserveWithStrategy(size_t size, IColumn::ReserveStrategy strategy)
685+
{
686+
switch (strategy)
687+
{
688+
case ReserveStrategy::Default:
689+
chars.reserve(n * size);
690+
break;
691+
case ReserveStrategy::ScaleFactor1_5:
692+
chars.reserve_exact(n / 2 * 3 * size);
693+
break;
694+
}
695+
}
696+
684697
void ColumnFixedString::getExtremes(Field & min, Field & max) const
685698
{
686699
min = String();

dbms/src/Columns/ColumnFixedString.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ class ColumnFixedString final : public COWPtrHelper<IColumn, ColumnFixedString>
193193

194194
void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override;
195195

196+
size_t capacity() const override { return chars.capacity() / n; }
197+
196198
void insertRangeFrom(const IColumn & src, size_t start, size_t length) override;
197199

198200
ColumnPtr filter(const IColumn::Filter & filt, ssize_t result_size_hint) const override;
@@ -223,7 +225,7 @@ class ColumnFixedString final : public COWPtrHelper<IColumn, ColumnFixedString>
223225

224226
void gather(ColumnGathererStream & gatherer_stream) override;
225227

226-
void reserve(size_t size) override { chars.reserve(n * size); }
228+
void reserveWithStrategy(size_t size, IColumn::ReserveStrategy strategy) override;
227229
void reserveAlign(size_t size, size_t alignment) override { chars.reserve(n * size, alignment); }
228230

229231
void getExtremes(Field & min, Field & max) const override;

dbms/src/Columns/ColumnFunction.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,9 @@ class ColumnFunction final : public COWPtrHelper<IColumn, ColumnFunction>
272272
throw Exception("getPermutation is not implemented for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
273273
}
274274

275+
// A fake capacity for ColumnFunction, as it does not hold data in the same way as other columns.
276+
size_t capacity() const override { return 0; }
277+
275278
void gather(ColumnGathererStream &) override
276279
{
277280
throw Exception("Method gather is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);

dbms/src/Columns/ColumnNothing.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ class ColumnNothing final : public COWPtrHelper<IColumnDummy, ColumnNothing>
2929

3030
public:
3131
const char * getFamilyName() const override { return "Nothing"; }
32-
MutableColumnPtr cloneDummy(size_t s) const override { return ColumnNothing::create(s); };
32+
MutableColumnPtr cloneDummy(size_t s) const override { return ColumnNothing::create(s); }
3333

3434
bool canBeInsideNullable() const override { return true; }
35+
36+
// ColumnNothing does not hold any data, so capacity is 0.
37+
size_t capacity() const override { return 1; }
3538
};
3639

3740
} // namespace DB

0 commit comments

Comments
 (0)