Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
query_info.prewhere_info, reader_settings, virt_columns);
            pipes.emplace_back(std::move(source));
        }
        auto pipe = Pipe::unitePipes(std::move(pipes));
        
        if (!out_projection)
            out_projection = createProjection(pipe.getHeader());
        QueryPlanPtr plan = createPlanFromPipe(std::move(pipe), query_id, data, "with final");
        auto expression_step = std::make_unique<ExpressionStep>(
            plan->getCurrentDataStream(),
            metadata_snapshot->getSortingKey().expression->getActionsDAG().clone());
        expression_step->setStepDescription("Calculate sorting key expression");
        plan->addStep(std::move(expression_step));
        partition_plans.emplace_back(std::move(plan));
    }
    if (partition_plans.empty())
        return {};
    if (partition_plans.size() == 1)
        return std::move(partition_plans.front());
    auto result_header = partition_plans.front()->getCurrentDataStream().header;
    DataStreams input_streams;
    for (const auto & partition_plan : partition_plans)
        input_streams.push_back(partition_plan->getCurrentDataStream());
    auto union_step = std::make_unique<UnionStep>(std::move(input_streams), result_header);
    union_step->setStepDescription("Unite sources after FINAL");
    QueryPlanPtr plan = std::make_unique<QueryPlan>();
    plan->unitePlans(std::move(union_step), std::move(partition_plans));
    return plan;
}
MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(