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
friend class MergeTreeDataMergerMutator;
    friend struct ReplicatedMergeTreeTableMetadata;
    friend class StorageReplicatedMergeTree;
    friend class MergeTreeDataWriter;
    friend class MergeTask;
    friend class IPartMetadataManager;
    bool require_part_metadata;
    
    
    String relative_data_path;
    
    ColumnSizeByName column_sizes;
    
    IndexSizeByName secondary_index_sizes;
    
    BrokenPartCallback broken_part_callback;
    String log_name;
    Poco::Logger * log;
    
    
    MultiVersion<MergeTreeSettings> storage_settings;
    
    mutable std::shared_mutex pinned_part_uuids_mutex;
    PinnedPartUUIDsPtr pinned_part_uuids;
    
    mutable std::atomic_bool transactions_enabled = false;
    
    struct TagByInfo{};
    struct TagByStateAndInfo{};
    static const MergeTreePartInfo & dataPartPtrToInfo(const DataPartPtr & part)