diff --git a/src/Columns/ColumnString.cpp b/src/Columns/ColumnString.cpp index c99de961e74..a250f9f89ad 100644 --- a/src/Columns/ColumnString.cpp +++ b/src/Columns/ColumnString.cpp @@ -183,10 +183,12 @@ void ColumnString::expand(const IColumn::Filter & mask, bool inverted) if (from < 0) throw Exception("Too many bytes in mask", ErrorCodes::LOGICAL_ERROR); - int len = offsets_data[from] - offsets_data[from - 1]; - /// Copy only if it makes sense. + size_t len = offsets_data[from] - offsets_data[from - 1]; + + /// Copy only if it makes sense. It's important to copy backward, because + /// ranges can overlap, but destination is always is more to the right then source if (last_offset - len != offsets_data[from - 1]) - memcpy(&chars_data[last_offset - len], &chars_data[offsets_data[from - 1]], len); + std::copy_backward(&chars_data[offsets_data[from - 1]], &chars_data[offsets_data[from]], &chars_data[last_offset]); last_offset -= len; --from; } diff --git a/src/Columns/MaskOperations.cpp b/src/Columns/MaskOperations.cpp index 8841564c89e..5433983363b 100644 --- a/src/Columns/MaskOperations.cpp +++ b/src/Columns/MaskOperations.cpp @@ -206,7 +206,7 @@ int checkShirtCircuitArguments(const ColumnsWithTypeAndName & arguments) int last_short_circuit_argument_index = -1; for (size_t i = 0; i != arguments.size(); ++i) { - if (const auto * column_function = checkAndGetShortCircuitArgument(arguments[i].column)) + if (checkAndGetShortCircuitArgument(arguments[i].column)) last_short_circuit_argument_index = i; }