If they are defined, they can override table-level settings.
, ErrorCodes::ALTER_OF_COLUMN_IS_FORBIDDEN);
    }
}
}
void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, ContextPtr local_context) const
{
    
    StorageInMemoryMetadata new_metadata = getInMemoryMetadata();
    StorageInMemoryMetadata old_metadata = getInMemoryMetadata();
    const auto & settings = local_context->getSettingsRef();
    const auto & settings_from_storage = getSettings();
    if (!settings.allow_non_metadata_alters)
    {
        auto mutation_commands = commands.getMutationCommands(new_metadata, settings.materialize_ttl_after_modify, getContext());
        if (!mutation_commands.empty())
            throw Exception(ErrorCodes::ALTER_OF_COLUMN_IS_FORBIDDEN, "The following alter commands: '{}' will modify data on disk, but setting `allow_non_metadata_alters` is disabled", queryToString(mutation_commands.ast()));
    }
    commands.apply(new_metadata, getContext());
    
    NameSet columns_alter_type_forbidden;
    
    
    NameSet columns_alter_type_metadata_only;
    
    NameSet columns_alter_type_check_safe_for_partition;
    if (old_metadata.hasPartitionKey())
    {
        
        auto partition_key_expr = old_metadata.getPartitionKey().expression;
        for (const auto & action : partition_key_expr->getActions())