`DataTypeFactory::get` locks a mutex inside shared a context, there was a case when many threads were locked inside it

https://pastila.nl/?0043b3e6/c557368f4cf0eb87a3c6f2cc162bc693

It is not clear which thread locked the mutex for a long time. However, it may be possible to lock less inside `DataTypeFactory::get`.
random.words.b = thread_local_rng(); 
    if (client_info.client_trace_context.trace_id != UUID())
    {
        
        
        query_trace_context = client_info.client_trace_context;
        query_trace_context.span_id = thread_local_rng();
    }
    else if (client_info.query_kind == ClientInfo::QueryKind::INITIAL_QUERY)
    {
        
        
        std::bernoulli_distribution should_start_trace{
            settings.opentelemetry_start_trace_probability};
        if (should_start_trace(thread_local_rng))
        {
            
            query_trace_context.trace_id = random.uuid;
            query_trace_context.span_id = thread_local_rng();
            
            query_trace_context.trace_flags = 1;
        }
    }
    String query_id_to_set = query_id;
    if (query_id_to_set.empty())    
    {
        
        struct QueryUUID : Poco::UUID
        {
            QueryUUID(const char * bytes, Poco::UUID::Version version)