Le catalogue pg_cast stocke les chemins de conversion de type de donnée, qu'ils soient par défaut ou définis avec la commande CREATE CAST.
Tableau 42.11. Colonnes de pg_cast
Nom | Type | Références | Description |
---|---|---|---|
castsource | oid | pg_type.oid | OID du type de données source |
casttarget | oid | pg_type.oid | OID du type de données en sortie |
castfunc | oid | pg_proc.oid | OID de la fonction à utiliser pour faire cette conversion. Vaut Zéro si les types de données sont binairement compatibles (c'est-à-dire si aucune opération n'est nécessaire pour effectuer la transformation). |
castcontext | char | Indique dans quel contexte la conversion peut être utilisée. e si seules les conversions explicites sont autorisées (avec CAST ou ::). a si les conversions implicites lors de l'affectation à une colonne sont autorisées, en plus des conversions explicites. i si les conversions implicites dans les expressions sont autorisées en plus des autres cas. |
Les fonctions de conversion listées dans pg_cast doivent toujours prendre le type source de la conversion comme type du premier argument et renvoyer le type de destination de la conversion comme type de retour. Une fonction de conversion peut avoir jusqu'à trois arguments. Le deuxième argument, s'il est présent, doit être du type integer ; il reçoit le modificateur de type associé avec le type de destination ou -1 s'il n'y en a pas. Le troisième argument, s'il est présent, doit être du type boolean ; il reçoit true si la conversion est une conversion explicite, false sinon.
Il est légitime de créer une entrée pg_cast dans laquelle les types source et cible sont les mêmes, si la fonction associée prend plus d'un argument. De telles entrées représentent les « fonctions de coercition de longueur » qui forcent les valeurs du type à être légal pour une valeur particulière du modificateur de type. Néanmoins, notez qu'à présent il n'existe aucun support pour associer des modifications de type autres que ceux de base avec des types de données créés par l'utilisateur. Du coup, cette fonctionnalité est seulement utile pour un petit nombre de types intégrés qui ont une syntaxe de modificateur de type construit dans leur grammaire.
Quand une entrée pg_cast a des types différents pour la source et la destination et qu'une fonction prend plus d'un argument, il représente la conversion d'un type vers un autre et la coercition en une seule étape. Quand une telle entrée est absente, la coercition vers un type qui utilise un modificateur de type implique deux étapes, une pour convertir entre les types de données et une seconde pour appliquer le modificateur.