Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
VirtualColumnUtils::filterBlockWithQuery(query_info.query, virtual_columns_block, context);
    auto part_values = VirtualColumnUtils::extractSingleValueFromBlock<String>(virtual_columns_block, "_part");
    metadata_snapshot->check(real_column_names, data.getVirtuals(), data.getStorageID());
    const Settings & settings = context.getSettingsRef();
    const auto & primary_key = metadata_snapshot->getPrimaryKey();
    Names primary_key_columns = primary_key.column_names;
    KeyCondition key_condition(query_info, context, primary_key_columns, primary_key.expression);
    if (settings.force_primary_key && key_condition.alwaysUnknownOrTrue())
    {
        throw Exception(ErrorCodes::INDEX_NOT_USED, "Primary key ({}) is not used and setting 'force_primary_key' is set.",
                        boost::algorithm::join(primary_key_columns, ", "));
    }
    std::optional<KeyCondition> minmax_idx_condition;
    std::optional<PartitionPruner> partition_pruner;
    if (data.minmax_idx_expr)
    {
        minmax_idx_condition.emplace(query_info, context, data.minmax_idx_columns, data.minmax_idx_expr);
        partition_pruner.emplace(metadata_snapshot->getPartitionKey(), query_info, context, false );
        if (settings.force_index_by_date && (minmax_idx_condition->alwaysUnknownOrTrue() && partition_pruner->isUseless()))
        {
            String msg = "Neither MinMax index by columns (";
            bool first = true;
            for (const String & col : data.minmax_idx_columns)
            {
                if (first)
                    first = false;
                else
                    msg += ", ";
                msg += col;
            }