| 642 | } |
| 643 | |
| 644 | void MergeJoin::joinBlock(Block & block, ExtraBlockPtr & not_processed) |
| 645 | { |
| 646 | Names lowcard_keys = lowcard_right_keys; |
| 647 | if (block) |
| 648 | { |
| 649 | JoinCommon::checkTypesOfKeys(block, table_join->keyNamesLeft(), right_table_keys, table_join->keyNamesRight()); |
| 650 | materializeBlockInplace(block); |
| 651 | |
| 652 | for (const auto & column_name : table_join->keyNamesLeft()) |
| 653 | { |
| 654 | if (block.getByName(column_name).type->lowCardinality()) |
| 655 | lowcard_keys.push_back(column_name); |
| 656 | } |
| 657 | |
| 658 | JoinCommon::removeLowCardinalityInplace(block, table_join->keyNamesLeft(), false); |
| 659 | |
| 660 | sortBlock(block, left_sort_description); |
| 661 | |
| 662 | if (nullable_left_side) |
| 663 | JoinCommon::convertColumnsToNullable(block); |
| 664 | } |
| 665 | |
| 666 | if (!not_processed && left_blocks_buffer) |
| 667 | { |
| 668 | if (!block || block.rows()) |
| 669 | block = left_blocks_buffer->exchange(std::move(block)); |
| 670 | if (!block) |
| 671 | return; |
| 672 | } |
| 673 | |
| 674 | if (is_in_memory) |
| 675 | { |
| 676 | if (is_all_join) |
| 677 | joinSortedBlock<true, true>(block, not_processed); |
| 678 | else |
| 679 | joinSortedBlock<true, false>(block, not_processed); |
| 680 | } |
| 681 | else |
| 682 | { |
| 683 | if (is_all_join) |
| 684 | joinSortedBlock<false, true>(block, not_processed); |
| 685 | else |
| 686 | joinSortedBlock<false, false>(block, not_processed); |
| 687 | } |
| 688 | |
| 689 | /// Back thread even with no data. We have some unfinished data in buffer. |
| 690 | if (!not_processed && left_blocks_buffer) |
| 691 | not_processed = std::make_shared<NotProcessed>(NotProcessed{{}, 0, 0, 0}); |
| 692 | |
| 693 | for (const auto & column_name : lowcard_keys) |
| 694 | { |
| 695 | if (!block.has(column_name)) |
| 696 | continue; |
| 697 | if (auto & col = block.getByName(column_name); !col.type->lowCardinality()) |
| 698 | JoinCommon::changeLowCardinalityInplace(col); |
| 699 | } |
| 700 | |
| 701 | JoinCommon::restoreLowCardinalityInplace(block); |
nothing calls this directly
no test coverage detected