| 444 | } |
| 445 | |
| 446 | ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t) const override |
| 447 | { |
| 448 | auto input = extractKeyAndValueInput(arguments); |
| 449 | |
| 450 | auto result_column = result_type->createColumn(); |
| 451 | auto result_columns = extractResultColumns(result_column, result_type); |
| 452 | |
| 453 | auto call = [&](const auto & types) |
| 454 | { |
| 455 | using Types = std::decay_t<decltype(types)>; |
| 456 | using KeyType = typename Types::LeftType; |
| 457 | using ValueType = typename Types::RightType; |
| 458 | |
| 459 | static constexpr bool key_and_value_are_numbers = IsDataTypeNumber<KeyType> && IsDataTypeNumber<ValueType>; |
| 460 | static constexpr bool key_is_float = std::is_same_v<KeyType, DataTypeFloat32> || std::is_same_v<KeyType, DataTypeFloat64>; |
| 461 | |
| 462 | if constexpr (key_and_value_are_numbers && !key_is_float) |
| 463 | { |
| 464 | using KeyFieldType = typename KeyType::FieldType; |
| 465 | using ValueFieldType = typename ValueType::FieldType; |
| 466 | |
| 467 | executeImplTyped<KeyFieldType, ValueFieldType>( |
| 468 | input.key_column, |
| 469 | input.value_column, |
| 470 | input.offsets_column, |
| 471 | input.max_key_column, |
| 472 | std::move(result_columns.result_key_column), |
| 473 | std::move(result_columns.result_value_column), |
| 474 | std::move(result_columns.result_offset_column)); |
| 475 | |
| 476 | return true; |
| 477 | } |
| 478 | |
| 479 | return false; |
| 480 | }; |
| 481 | |
| 482 | if (!callOnTwoTypeIndexes(input.key_series_type->getTypeId(), input.value_series_type->getTypeId(), call)) |
| 483 | throw Exception(ErrorCodes::ILLEGAL_COLUMN, |
| 484 | "Function {} illegal columns passed as arguments", |
| 485 | getName()); |
| 486 | |
| 487 | if (result_columns.result_array_additional_offset_column) |
| 488 | { |
| 489 | result_columns.result_array_additional_offset_column->insertRangeFrom( |
| 490 | *result_columns.result_offset_column_raw, |
| 491 | 0, |
| 492 | result_columns.result_offset_column_raw->size()); |
| 493 | } |
| 494 | |
| 495 | return result_column; |
| 496 | } |
| 497 | }; |
| 498 | |
| 499 | REGISTER_FUNCTION(MapPopulateSeries) |
no test coverage detected