PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgresql :enum et caractères variables, mise à jour

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;