ClickHouse ColumnString

 
  • ColumnString 存储结构.

 
Offsets是 元素的偏移量,UInt64比较合理.
我们可以从 insert 函数中得到 chars (PaddedPODArray<UInt8>)和offsets (PaddedPODArray<>的配合关系.
函数基本作用就是 将chars进行resize. 这个比较考验PaddedPODArray的设计.
/Users/growingio/Software/clickhouse-gio/src/Columns/ColumnString.h 119
resize() 在 PaddedArrayBase中 当超过capacity()时,会重新使用Allocator进行分配内存.
resize()函数是如何做到分配内存不超出大小的?我们从offsets.push_back()可以看到,对新的String的偏移是直接push_back到offsets中的。offsets是不会有变化的, resize伴随着realloc可能会造成copy。
  • field.template get<T>() 第一次见. 访问对象中的模板函数的写法?如果get方法不是模板,那么直接访问 field.get()就可以了.
T get() 函数目的就是完成强转.
using StoredType = NearestFieldType<std::decay_t<T>>;
String的NearestFieldType 仍然是String.
最后把存储在storage中的数据强转成String类型.
 
 
private:
std::aligned_union_t<DBMS_MIN_FIELD_SIZE - sizeof(Types::Which),
Null, UInt64, UInt128, UInt256, Int64, Int128, Int256, UUID, Float64, String, Array, Tuple, Map,
DecimalField<Decimal32>, DecimalField<Decimal64>, DecimalField<Decimal128>, DecimalField<Decimal256>,
AggregateFunctionStateData
> storage;
 
 
posted @ 2021-12-06 10:05  博客记  阅读(245)  评论(0编辑  收藏  举报