Le problème avec une simple tentative est que vous avez un casting appelant le casting, appelant le casting, appelant le casting...
Vous devez en quelque sorte vous éloigner de varchar-> enum dans votre distribution. Le moyen le plus simple (le plus compréhensible) consiste à convertir manuellement. Notez que les littéraux de chaîne convertis dans l'instruction case ne sont pas du texte, ils sont de type inconnu entre guillemets, ce qui évite la récursivité infinie.
BEGIN;
CREATE TYPE t_tl AS ENUM ('red', 'amber', 'green');
CREATE FUNCTION dummy_cast(varchar) RETURNS t_tl AS $$
SELECT CASE $1
WHEN 'red' THEN 'red'::t_tl
WHEN 'amber' THEN 'amber'::t_tl
WHEN 'green' THEN 'green'::t_tl
END;
$$ LANGUAGE SQL;
CREATE CAST (varchar AS t_tl) WITH FUNCTION dummy_cast(varchar) AS ASSIGNMENT;
CREATE TABLE t (x t_tl);
INSERT INTO t VALUES ('red');
INSERT INTO t VALUES ('green'::varchar);
SELECT * FROM t;
ROLLBACK;