CREATE CAST

Nom

CREATE CAST -- définit une nouvelle conversion

Synopsis

CREATE CAST (typesource AS typecible)
    WITH FUNCTION nomfonction (argtype)
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (typesource AS typecible)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

Description

CREATE CAST définit une nouvelle conversion. Une conversion spécifie la façon de réaliser une conversion entre deux types de données. Par exemple,

SELECT CAST(42 AS text);

convertit la constante entière 42 dans le type text en appelant une fonction précédemment spécifiée, dans ce cas text(int4). (Si aucune conversion convenable n'a été définie, la conversion échoue.)

Deux types pourraient être compatibles binairement, ce qui signifie qu'ils peuvent être convertis dans l'autre type << librement >> sans appeler de fonction. Ceci requiert que les valeurs correspondantes utilisent la même représentation interne. En fait, les types text et varchar sont compatibles binairement.

Par défaut, une conversion peut être appelée par une demande explicite. Voici des constructions explicites : CAST(x AS nomtype), x::nomtype ou nomtype(x).

Si la conversion est marquée AS ASSIGNMENT, alors elle peut être appelée implicitement lors de l'affectation d'une valeur à une colonne du type de données cible. Par exemple, en supposant que foo.f1 est une colonne de type text, alors

INSERT INTO foo (f1) VALUES (42);

sera autorisé si la conversion du type integer vers le type text est indiquée AS ASSIGNMENT, sinon cela sera interdit. (Nous utilisons généralement le terme de conversion d'affectation pour décrire ce type de conversion.)

Si la conversion est marquée AS IMPLICIT, alors elle peut être appelée implicitement dans tout contexte, que ce soit une affectation ou en interne dans une expression. Par exemple, comme || prend deux opérandes text,

SELECT 'L\'heure est ' || now();

sera autorisé seulement si la conversion du type timestamp vers le type text est marquée AS IMPLICIT. Sinon, il sera nécessaire d'écrire explicitement la conversion, par exemple

SELECT 'L\'heure est ' || CAST(now() AS text);

(Nous utilisons généralement le terme de conversion implicite pour décrire ce type de conversion.)

Il est conseillé d'être conservateur sur le marquage des conversions comme implicites. Une surabondance de chemins de conversions implicites peut faire en sorte que PostgreSQL effectue des choix surprenant suite à l'interprétations des commandes ou soit complètement incapable de résoudre les commandes parce qu'il existe plusieurs interprétations possibles. Une bonne règle à suivre est de réaliser une conversion implicite appelable seulement pour les transformations préservant l'information entre les types dans la même catégorie générale. Par exemple, la conversion entre int2 et int4 peut être raisonnablement implicite mais celle entre float8 et int4 devraient être probablement uniquement sur affectation. Les conversions entre catégorie, tels que de text vers int4, sont bien préférables en mode explicite seul.

Pour être capable de créer une conversion, vous devez être le propriétaire du type source ou destination. Pour créer une conversion compatible binairement, vous devez être superutilisateur. (Cette restriction est faite parce qu'une conversion compatible binairement erronée peut facilement causer un arrêt brutal du serveur.)

Paramètres

typesource

Le nom du type de données source dans la conversion.

typecible

Le nom du type de données cible dans la conversion.

nomfonction (type_argument)

La fonction utilisée pour effectuer la conversion. Le nom de la fonction pourrait être qualifié du nom du schéma. Si ce n'est pas le cas, la fonction sera recherchée dans le chemin. Le type d'argument doit être identique au type source, le type de données résultat doit correspondre au type cible de la conversion.

WITHOUT FUNCTION

Indique que le type source et le type cible sont compatibles binairement, donc aucune fonction n'est requise pour effectuer la conversion.

AS ASSIGNMENT

Indique que la conversion pourrait être appelée implicitement dans les contextes d'affectation.

AS IMPLICIT

Indique que la conversion pourrait être appelée implicitement dans tout contexte.

Notes

Utilisez DROP CAST pour supprimer les conversions définies par l'utilisateur.

Rappelez-vous que si vous souhaitez être capable de convertir les types dans les deux sens, vous devez déclarer explicitement les deux sens.

Avant PostgreSQL 7.3, chaque fonction qui avait le même nom qu'un type de données, envoyait ce type de données et prenait un argument d'un autre type était automatiquement détectée comme une fonction de conversion. Ceci a été abandonné lors de l'introduction des schémas et pour être capable de représenter des conversions compatibles binairement dans les catalogues système. (Les fonctions de conversion intégrées suivent toujours le même schéma de nommage mais elle doivent maintenant être données comme conversion dans le catalogue système pg_cast.)

Exemples

Pour créer une conversion du type text vers le type int4 en utilisant la fonction int4(text) :

CREATE CAST (text AS int4) WITH FUNCTION int4(text);

(Cette conversion est déjà prédéfinie dans le système.)

Compatibilité

La commande CREATE CAST est conforme à SQL99 sauf que SQL99 ne parle pas des types compatibles binairement. AS IMPLICIT est aussi une extension PostgreSQL.

Voir aussi

CREATE FUNCTION, CREATE TYPE, DROP CAST