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
*/
    virtual Pipe read(
        const Names & ,
        const StorageSnapshotPtr & ,
        SelectQueryInfo & ,
        ContextPtr ,
        QueryProcessingStage::Enum ,
        size_t ,
        unsigned );
    
    
    virtual void read(
        QueryPlan & query_plan,
        const Names & ,
        const StorageSnapshotPtr & ,
        SelectQueryInfo & ,
        ContextPtr ,
        QueryProcessingStage::Enum ,
        size_t ,
        unsigned );
    /** Writes the data to a table.
      * Receives a description of the query, which can contain information about the data write method.
      * Returns an object by which you can write data sequentially.
      *
      * metadata_snapshot is consistent snapshot of table metadata, it should be
      * passed in all parts of the returned streams. Storage metadata can be
      * changed during lifetime of the returned streams, but the snapshot is
      * guaranteed to be immutable.
      */
    virtual SinkToStoragePtr write(