La raison est donnée dans le commentaire suivant dans AlterEnum
dans src/backend/commands/typecmds.c
:
/*
* Ordinairement, nous interdisons d'ajouter des valeurs dans des blocs de transaction,
* car nous ne pouvons pas gérer le fait que des valeurs OID d'énumération se retrouvent dans des index et
* ensuite que leurs entrées de pg_enum définissantes disparaissent. Cependant, c'est
* correct si le type d'énumération a été créé dans la transaction actuelle, car
* il ne peut alors y avoir aucun index de ce type qui ne disparaîtrait pas
* en cas de Rollback. (Nous prenons en charge ce cas parce que pg_dump
* --binary-upgrade en a besoin).
Notez que cette restriction a été levée dans commit 212fab99; le message de commit indique:
Pour éviter que les index sur les colonnes enum soient potentiellement cassés, nous devons nous assurer que
les valeurs enum non engagées ne sont pas stockées dans les tables, sauf si nous
sommes sûrs qu'une telle colonne est nouvelle dans la transaction en cours.
Auparavant, nous imposions cela en interdisant l'exécution de ALTER TYPE ... ADD VALUE
dans un bloc de transaction, sauf si le type enum cible avait été créé dans la transaction en cours. Cette
patch supprime cette restriction, et insiste plutôt sur le fait qu'une valeur enum non engagée
ne peut être référencée que si elle appartient à un type enum créé
dans la même transaction que la valeur. Suite à la discussion, cela devrait être
un peu moins contraignant. Il nécessite que chaque fonction susceptible de
renvoyer une nouvelle valeur enum aux opérations SQL vérifie cette restriction,
mais il n'y en a pas tant que ça qui rende cela insoutenable.
Il serait donc peut-être temps de passer à PostgreSQL v12 :^)