Converts `columns` from `source_sample_block` structure to `result_sample_block`. Can select subset of columns and change types.
| 26 | /// Converts `columns` from `source_sample_block` structure to `result_sample_block`. |
| 27 | /// Can select subset of columns and change types. |
| 28 | static MutableColumns convertBlockStructure( |
| 29 | const Block & source_sample_block, const Block & result_sample_block, MutableColumns && columns, const PaddedPODArray<UInt8> & null_map) |
| 30 | { |
| 31 | MutableColumns result_columns; |
| 32 | for (const auto & out_sample_col : result_sample_block) |
| 33 | { |
| 34 | /// Some columns from result_sample_block may not be in source_sample_block, |
| 35 | /// e.g. if they will be calculated later based on joined columns |
| 36 | if (!source_sample_block.has(out_sample_col.name)) |
| 37 | continue; |
| 38 | |
| 39 | auto i = source_sample_block.getPositionByName(out_sample_col.name); |
| 40 | if (columns[i] == nullptr) |
| 41 | { |
| 42 | throw DB::Exception(ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK, "Can't find column '{}'", out_sample_col.name); |
| 43 | } |
| 44 | |
| 45 | ColumnWithTypeAndName col = source_sample_block.getByPosition(i); |
| 46 | if (!col.type->equals(*out_sample_col.type)) |
| 47 | { |
| 48 | col.column = std::move(columns[i]); |
| 49 | result_columns.push_back(IColumn::mutate(castColumnAccurate(col, out_sample_col.type))); |
| 50 | } |
| 51 | else |
| 52 | { |
| 53 | result_columns.push_back(std::move(columns[i])); |
| 54 | } |
| 55 | columns[i] = nullptr; |
| 56 | |
| 57 | if (result_columns.back()->isNullable()) |
| 58 | { |
| 59 | assert_cast<ColumnNullable *>(result_columns.back().get())->applyNegatedNullMap(null_map); |
| 60 | } |
| 61 | } |
| 62 | return result_columns; |
| 63 | } |
| 64 | |
| 65 | DirectKeyValueJoin::DirectKeyValueJoin(std::shared_ptr<TableJoin> table_join_, |
| 66 | const Block & right_sample_block_, |
no test coverage detected