| 259 | |
| 260 | template <bool nullable> |
| 261 | void executeGeneric( |
| 262 | const IColumn & src_data, const ColumnArray::Offsets & src_offsets, |
| 263 | IColumn & res_data, ColumnArray::Offsets & res_offsets, |
| 264 | const NullMap * src_null_map, |
| 265 | NullMap * res_null_map) |
| 266 | { |
| 267 | size_t size = src_offsets.size(); |
| 268 | res_offsets.resize(size); |
| 269 | res_data.reserve(src_data.size()); |
| 270 | |
| 271 | if (nullable) |
| 272 | res_null_map->reserve(src_null_map->size()); |
| 273 | |
| 274 | ColumnArray::Offset src_prev_offset = 0; |
| 275 | ColumnArray::Offset res_prev_offset = 0; |
| 276 | |
| 277 | for (size_t i = 0; i < size; ++i) |
| 278 | { |
| 279 | if (src_offsets[i] != src_prev_offset) |
| 280 | { |
| 281 | size_t size_to_write = src_offsets[i] - src_prev_offset; |
| 282 | res_data.insertRangeFrom(src_data, src_prev_offset, size_to_write); |
| 283 | |
| 284 | if (nullable) |
| 285 | { |
| 286 | res_null_map->resize(res_prev_offset + size_to_write); |
| 287 | memcpy(&(*res_null_map)[res_prev_offset], &(*src_null_map)[src_prev_offset], size_to_write); |
| 288 | } |
| 289 | |
| 290 | res_prev_offset += size_to_write; |
| 291 | res_offsets[i] = res_prev_offset; |
| 292 | } |
| 293 | else |
| 294 | { |
| 295 | res_data.insertDefault(); |
| 296 | ++res_prev_offset; |
| 297 | res_offsets[i] = res_prev_offset; |
| 298 | |
| 299 | if (nullable) |
| 300 | res_null_map->push_back(ColumnNullable::IS_NULL_MASK); |
| 301 | } |
| 302 | |
| 303 | src_prev_offset = src_offsets[i]; |
| 304 | } |
| 305 | } |
| 306 | |
| 307 | |
| 308 | template <bool nullable> |
no test coverage detected