#include #include #include namespace DB { void IDataType::updateAvgValueSizeHint(const IColumn & column, double & avg_value_size_hint) { /// Update the average value size hint if amount of read rows isn't too small size_t column_size = column.size(); if (column_size > 10) { double current_avg_value_size = static_cast(column.byteSize()) / column_size; /// Heuristic is chosen so that avg_value_size_hint increases rapidly but decreases slowly. if (current_avg_value_size > avg_value_size_hint) avg_value_size_hint = std::min(1024., current_avg_value_size); /// avoid overestimation else if (current_avg_value_size * 2 < avg_value_size_hint) avg_value_size_hint = (current_avg_value_size + avg_value_size_hint * 3) / 4; } } ColumnPtr IDataType::createConstColumn(size_t size, const Field & field) const { ColumnPtr column = createColumn(); column->insert(field); return std::make_shared(column, size); } }