From 2d6d90a2cc59e2061c3874ec286aba34e2440b9d Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sat, 11 Mar 2017 04:12:14 +0300 Subject: [PATCH] ColumnFixedString: better 'replicate' method [#CLICKHOUSE-2877]. --- dbms/src/Columns/ColumnFixedString.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/dbms/src/Columns/ColumnFixedString.cpp b/dbms/src/Columns/ColumnFixedString.cpp index 96ebaae73dc..ea1d1a977e6 100644 --- a/dbms/src/Columns/ColumnFixedString.cpp +++ b/dbms/src/Columns/ColumnFixedString.cpp @@ -211,18 +211,12 @@ ColumnPtr ColumnFixedString::replicate(const Offsets_t & offsets) const return res; Chars_t & res_chars = res->chars; - res_chars.reserve(n * offsets.back()); + res_chars.resize(n * offsets.back()); - Offset_t prev_offset = 0; + Offset_t curr_offset = 0; for (size_t i = 0; i < col_size; ++i) - { - size_t size_to_replicate = offsets[i] - prev_offset; - prev_offset = offsets[i]; - - for (size_t j = 0; j < size_to_replicate; ++j) - for (size_t k = 0; k < n; ++k) - res_chars.push_back(chars[i * n + k]); - } + for (size_t next_offset = offsets[i]; curr_offset < next_offset; ++curr_offset) + memcpySmallAllowReadWriteOverflow15(&res->chars[curr_offset * n], &chars[i * n], n); return res; }