Got something like that in practice with backup recovery - IRL most probably the sequence of events leading to that discrepancy was different (not clear yet).

```sql
drop table enum_alter_issue;
create table enum_alter_issue (a Enum8('one' = 1, 'two' = 2)) engine = ReplicatedMergeTree('/clickhouse/tables/enum_alter_issue', 'test') ORDER BY a;

-- backup / move part aside or similar operation 
insert into enum_alter_issue values ('one'), ('two');
alter table enum_alter_issue detach partition id 'all';

-- schema evolution (enum get extended)
alter table enum_alter_issue modify column a Enum8('one' = 1, 'two' = 2, 'three' = 3);
insert into enum_alter_issue values ('one'), ('two');
alter table enum_alter_issue detach partition id 'all';

-- attempt to attach back all the parts (new generation and old generation)
alter table enum_alter_issue attach partition id 'all';

Received exception from server (version 21.9.1):
Code: 53. DB::Exception: Received from localhost:9000. DB::Exception: Type mismatch for column a. Column has type Enum8('one' = 1, 'two' = 2, 'three' = 3), got type Enum8('one' = 1, 'two' = 2). 
```
{
        auto rows_expression = getRowsTTL().expression;
        if (add_dependent_columns(rows_expression, required_ttl_columns) && include_ttl_target)
        {
            
            for (const auto & column : getColumns().getAllPhysical())
                updated_ttl_columns.insert(column.name);
        }
    }
    for (const auto & entry : getRecompressionTTLs())
        add_dependent_columns(entry.expression, required_ttl_columns);
    for (const auto & [name, entry] : getColumnTTLs())
    {
        if (add_dependent_columns(entry.expression, required_ttl_columns) && include_ttl_target)
            updated_ttl_columns.insert(name);
    }
    for (const auto & entry : getMoveTTLs())
        add_dependent_columns(entry.expression, required_ttl_columns);
    
    for (const auto & column : indices_columns)
        res.emplace(column, ColumnDependency::SKIP_INDEX);
    for (const auto & column : projections_columns)
        res.emplace(column, ColumnDependency::PROJECTION);
    for (const auto & column : required_ttl_columns)
        res.emplace(column, ColumnDependency::TTL_EXPRESSION);
    for (const auto & column : updated_ttl_columns)
        res.emplace(column, ColumnDependency::TTL_TARGET);
    return res;
}
Block StorageInMemoryMetadata::getSampleBlockNonMaterialized() const