| 377 | |
| 378 | template <bool assert_nullable = false> |
| 379 | static void writeFieldsToColumn( |
| 380 | IColumn & column_to, const Row & rows_data, size_t column_index, const std::vector<bool> & mask, ColumnUInt8 * null_map_column = nullptr) |
| 381 | { |
| 382 | if (ColumnNullable * column_nullable = typeid_cast<ColumnNullable *>(&column_to)) |
| 383 | writeFieldsToColumn<true>(column_nullable->getNestedColumn(), rows_data, column_index, mask, &column_nullable->getNullMapColumn()); |
| 384 | else |
| 385 | { |
| 386 | const auto & write_data_to_null_map = [&](const Field & field, size_t row_index) |
| 387 | { |
| 388 | if (!mask.empty() && !mask.at(row_index)) |
| 389 | return false; |
| 390 | |
| 391 | if constexpr (assert_nullable) |
| 392 | { |
| 393 | if (field.isNull()) |
| 394 | { |
| 395 | column_to.insertDefault(); |
| 396 | null_map_column->insertValue(1); |
| 397 | return false; |
| 398 | } |
| 399 | |
| 400 | null_map_column->insertValue(0); |
| 401 | } |
| 402 | |
| 403 | return true; |
| 404 | }; |
| 405 | |
| 406 | const auto & write_data_to_column = [&](auto * casted_column, auto from_type, auto to_type) |
| 407 | { |
| 408 | for (size_t index = 0; index < rows_data.size(); ++index) |
| 409 | { |
| 410 | const Tuple & row_data = DB::get<const Tuple &>(rows_data[index]); |
| 411 | const Field & value = row_data[column_index]; |
| 412 | |
| 413 | if (write_data_to_null_map(value, index)) |
| 414 | casted_column->insertValue(static_cast<decltype(to_type)>(value.template get<decltype(from_type)>())); |
| 415 | } |
| 416 | }; |
| 417 | |
| 418 | if (ColumnInt8 * casted_int8_column = typeid_cast<ColumnInt8 *>(&column_to)) |
| 419 | write_data_to_column(casted_int8_column, UInt64(), Int8()); |
| 420 | else if (ColumnInt16 * casted_int16_column = typeid_cast<ColumnInt16 *>(&column_to)) |
| 421 | write_data_to_column(casted_int16_column, UInt64(), Int16()); |
| 422 | else if (ColumnInt64 * casted_int64_column = typeid_cast<ColumnInt64 *>(&column_to)) |
| 423 | write_data_to_column(casted_int64_column, UInt64(), Int64()); |
| 424 | else if (ColumnUInt8 * casted_uint8_column = typeid_cast<ColumnUInt8 *>(&column_to)) |
| 425 | write_data_to_column(casted_uint8_column, UInt64(), UInt8()); |
| 426 | else if (ColumnUInt16 * casted_uint16_column = typeid_cast<ColumnUInt16 *>(&column_to)) |
| 427 | write_data_to_column(casted_uint16_column, UInt64(), UInt16()); |
| 428 | else if (ColumnUInt32 * casted_uint32_column = typeid_cast<ColumnUInt32 *>(&column_to)) |
| 429 | write_data_to_column(casted_uint32_column, UInt64(), UInt32()); |
| 430 | else if (ColumnUInt64 * casted_uint64_column = typeid_cast<ColumnUInt64 *>(&column_to)) |
| 431 | write_data_to_column(casted_uint64_column, UInt64(), UInt64()); |
| 432 | else if (ColumnFloat32 * casted_float32_column = typeid_cast<ColumnFloat32 *>(&column_to)) |
| 433 | write_data_to_column(casted_float32_column, Float64(), Float32()); |
| 434 | else if (ColumnFloat64 * casted_float64_column = typeid_cast<ColumnFloat64 *>(&column_to)) |
| 435 | write_data_to_column(casted_float64_column, Float64(), Float64()); |
| 436 | else if (ColumnDecimal<Decimal32> * casted_decimal_32_column = typeid_cast<ColumnDecimal<Decimal32> *>(&column_to)) |
no test coverage detected