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) ou x::nomtype.

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 des schémas. Le type de données résultant de la fonction doit correspondre au type cible de la conversion. Ses arguments sont discutés ci-dessous.

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.

Les fonctions de conversion peuvent avoir de un à trois arguments. Le premier argument doit avoir le même type que celui de la source de la conversion. Le deuxième argument, si fourni, doit être de type integer. Il correspond au modificateur de type associé au type de destination, ou il vaut -1 si il n'y en a pas. Le troisième argument, si fourni, doit être de type boolean. Il vaut true si la conversion est explicite, false dans le cas contraire. Bizarrement, les spécifications SQL demandent différents comportements pour les conversions explicites et implicites dans certains cas. Ce paramètre est fourni pour des fonctions qui doivent implémenter de tel cas. Il n'est pas recommandé que vous conceviez vos propres types de données qui entreraient dans ce cas de figure.

Généralement, une conversion doit avoir une source et une destination de type différent. Cependant, il est permis de déclarer une conversion avec un type source identique au type destination si la fonction de conversion a plus d'un argument. C'est utilisé pour représenter des fonctions de restrictions sur une longueur d'un type spécifique. La fonction nommée est utilisée pour restreindre la valeur d'un type suivant la valeur du modificateur de type donnée par le second paramètre (depuis que la grammaire actuelle permet seulement a certains types d'avoir des modificateurs de type, cette fonctionnalité n'est d'aucun intérêt pour les types sources définis par l'utilisateur, néanmoins nous le signalons).

Quand une conversion a un type source et un type destination différent et que la fonction a plus d'un argument, alors la conversion d'un type vers un autre et la restriction sur la longeur du type destination sont faits en une seule etape. Quand aucune entrée n'est disponible, alors la restriction du type qui utilise un modificateur de type implique deux étapes, une pour la conversion entre les types de données et la seconde pour appliquer le modificateur.

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.

Bien que cela ne soit pas requis, il est recommandé que vous continuez à suivre l'ancienne convention de nommage des fonctions de conversion après le type de données de destination. Beaucoup d'utilisateurs sont habitués à convertir des types de données en utilisant un style de notation de fonction, c'est-à-dire nom_type(x). En fait, cette notation n'est ni plus ni moins un appel à une fonction de conversion. Ce n'est pas forcément géré comme une conversion. Si vos fonctions de conversions ne sont pas nommées de tel façon a supporter cette convention alors vous aurez des utilisateurs surpris. Depuis que PostgreSQL permet de surcharger le même nom de fonction avec différents types d'argument, il n'y a aucune difficulté pour avoir plusieurs fonctions de conversion avec des types différents qui utilise le même nom de type destination.

Note : Il y a un petit mensonge dans le paragraphe précédent : il existe un cas dans lequel pg_cast sera utilisé pour résoudre le sens d'un appel de fonction évidente. Si un appel de fonction nom(x) coincide avec aucune fonction existante, alors nom(x) est le nom du type de donnée et pg_cast indique une conversion binairement compatible depuis le type de x, alors l'appel sera interprété comme une conversion explicite. Cette exception est faite de telle façon à ce que les conversions compatibles puissent etre invoquées en utilisant une syntaxe fonctionnel, même si elles n'ont aucune fonction (de conversion).

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 à SQL:1999 sauf que SQL:1999 ne parle pas des types compatibles binairement ou d'arguments supplémentaires pour les fonctions d'implémentation. AS IMPLICIT est aussi une extension PostgreSQL.

Voir aussi

CREATE FUNCTION, CREATE TYPE, DROP CAST