`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`.
void checkAccess(const AccessFlags & flags, const StorageID & table_id, const std::vector<std::string_view> & columns) const;
    void checkAccess(const AccessFlags & flags, const StorageID & table_id, const Strings & columns) const;
    void checkAccess(const AccessRightsElement & element) const;
    void checkAccess(const AccessRightsElements & elements) const;
    std::shared_ptr<const ContextAccess> getAccess() const;
    ASTPtr getRowPolicyFilter(const String & database, const String & table_name, RowPolicyFilterType filter_type) const;
    
    
    
    
    
    void enableRowPoliciesOfInitialUser();
    std::shared_ptr<const EnabledQuota> getQuota() const;
    std::optional<QuotaUsage> getQuotaUsage() const;
    
    void setExternalTablesInitializer(ExternalTablesInitializer && initializer);
    
    void initializeExternalTablesIfSet();
    
    void setInputInitializer(InputInitializer && initializer);
    
    void initializeInput(const StoragePtr & input_storage);
    
    void setInputBlocksReaderCallback(InputBlocksReader && reader);
    
    InputBlocksReader getInputBlocksReaderCallback() const;
    void resetInputCallbacks();
    ClientInfo & getClientInfo() { return client_info; }
    const ClientInfo & getClientInfo() const { return client_info; }
    enum StorageNamespace