Het probleem met een simpele poging is dat je een cast hebt die de cast roept, de cast roept, de cast roept...
Je moet op de een of andere manier wegkomen van varchar->enum in je cast. De eenvoudigste (meest begrijpelijke) manier is om gewoon handmatig te converteren. Merk op dat de letterlijke tekenreeksen die in de case-instructie worden gegoten, geen tekst zijn, ze zijn van het type met aanhalingstekens onbekend, wat de oneindige recursie omzeilt.
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;