And waits for them. That's pointless.
FutureMergedMutatedPart projection_future_part;
                MergeTreeData::DataPartsVector const_selected_parts(
                    std::make_move_iterator(selected_parts.begin()), std::make_move_iterator(selected_parts.end()));
                projection_future_part.assign(std::move(const_selected_parts));
                projection_future_part.name = fmt::format("{}_{}", projection.name, ++block_num);
                projection_future_part.part_info = {"all", 0, 0, 0};
                MergeTreeData::MergingParams projection_merging_params;
                projection_merging_params.mode = MergeTreeData::MergingParams::Ordinary;
                if (projection.type == ProjectionDescription::Type::Aggregate)
                    projection_merging_params.mode = MergeTreeData::MergingParams::Aggregating;
                LOG_DEBUG(log, "Merged {} parts in level {} to {}", selected_parts.size(), current_level, projection_future_part.name);
                next_level_parts.push_back(mergePartsToTemporaryPart(
                    projection_future_part,
                    projection.metadata,
                    merge_entry,
                    holder,
                    time_of_mutation,
                    context,
                    space_reservation,
                    false, 
                    {},
                    projection_merging_params,
                    new_data_part.get(),
                    "tmp_merge_"));
                next_level_parts.back()->is_temp = true;
            }
        }
    }
}
void MergeTreeDataMergerMutator::mutateAllPartColumns(