`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`.
FileProgressCallback file_progress_callback; 
    QueryStatus * process_list_elem = nullptr;  
    StorageID insertion_table = StorageID::createEmpty();  
    bool is_distributed = false;  
    String default_format;  
                            
    TemporaryTablesMapping external_tables_mapping;
    Scalars scalars;
    
    Scalars special_scalars;
    
    
    std::optional<ReadTaskCallback> next_task_callback;
    
    
    std::optional<MergeTreeReadTaskCallback> merge_tree_read_task_callback;
    
    struct QueryAccessInfo
    {
        QueryAccessInfo() = default;
        QueryAccessInfo(const QueryAccessInfo & rhs)
        {
            std::lock_guard<std::mutex> lock(rhs.mutex);
            databases = rhs.databases;
            tables = rhs.tables;
            columns = rhs.columns;
            projections = rhs.projections;
            views = rhs.views;
        }
        QueryAccessInfo(QueryAccessInfo && rhs) = delete;