Right now clickhouse allows to create TTL columns for Distributed tables during alters. It is working normally until server restart. After that it won't start because engine distributed doesn't support TTL clause. Modify metadata is required.

My cluster has 21.3 but tested it also with 21.11 and the same behavior.
It is blocked during create but it should be also be blocked during alters.
Tested on table from tutorial
ENGINE = Distributed('stage, 'default', 'hits_v1') 
alter table hits_v1_all modify column UTMCampaign String TTL EventDate + INTERVAL 1 MONTH ← it passes normally
void forgetPartAndMoveToDetached(const DataPartPtr & part, const String & prefix = "", bool restore_covered = false);
    
    void tryRemovePartImmediately(DataPartPtr && part);
    
    
    DataPartsVector grabOldParts(bool force = false);
    
    void rollbackDeletingParts(const DataPartsVector & parts);
    
    void removePartsFinally(const DataPartsVector & parts);
    
    void flushAllInMemoryPartsIfNeeded();
    
    
    size_t clearOldPartsFromFilesystem(bool force = false);
    void clearPartsFromFilesystem(const DataPartsVector & parts);
    
    size_t clearOldWriteAheadLogs();
    
    
    size_t clearOldTemporaryDirectories(size_t custom_directories_lifetime_seconds);
    size_t clearEmptyParts();
    
    
    void dropAllData();
    
    void dropIfEmpty();