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
CurrentlyMovingPartsTaggerPtr checkPartsForMove(const DataPartsVector & parts, SpacePtr space);
    bool canUsePolymorphicParts(const MergeTreeSettings & settings, String * out_reason = nullptr) const;
    std::mutex write_ahead_log_mutex;
    WriteAheadLogPtr write_ahead_log;
    virtual void startBackgroundMovesIfNeeded() = 0;
    bool allow_nullable_key{};
    void addPartContributionToDataVolume(const DataPartPtr & part);
    void removePartContributionToDataVolume(const DataPartPtr & part);
    void increaseDataVolume(ssize_t bytes, ssize_t rows, ssize_t parts);
    void setDataVolume(size_t bytes, size_t rows, size_t parts);
    std::atomic<size_t> total_active_size_bytes = 0;
    std::atomic<size_t> total_active_size_rows = 0;
    std::atomic<size_t> total_active_size_parts = 0;
    
    mutable std::set<String> query_id_set;
    mutable std::mutex query_id_set_mutex;
    
    MatcherFn getPartitionMatcher(const ASTPtr & partition, ContextPtr context) const;
    
    virtual std::unique_ptr<MergeTreeSettings> getDefaultSettings() const = 0;
    void loadDataPartsFromDisk(
        DataPartsVector & broken_parts_to_detach,
        DataPartsVector & duplicate_parts_to_remove,
        ThreadPool & pool,
        size_t num_parts,
        std::queue<std::vector<std::pair<String, DiskPtr>>> & parts_queue,
        bool skip_sanity_checks,
        const MergeTreeSettingsPtr & settings);
    void loadDataPartsFromWAL(
        DataPartsVector & broken_parts_to_detach,