CREATE TYPE

Nom

CREATE TYPE -- d�finit un nouveau type de donn�e

Synopsis

CREATE TYPE nom AS
    ( nom_attribut type_donn�e [, ... ] )

CREATE TYPE nom (
    INPUT = fonction_entr�e,
    OUTPUT = fonction_sortie
    [ , RECEIVE = fonction_r�ception ]
    [ , SEND = fonction_envoi ]
    [ , ANALYZE = fonction_analyze ]
    [ , INTERNALLENGTH = { longueurinterne | VARIABLE } ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = alignement ]
    [ , STORAGE = stockage ]
    [ , DEFAULT = d�faut ]
    [ , ELEMENT = �l�ment ]
    [ , DELIMITER = d�limiteur ]
)

Description

CREATE TYPE enregistre un nouveau type de donn�es � utiliser dans la base de donn�es actuelle. L'utilisateur qui d�finit un type devient son propri�taire.

Si un nom de sch�ma est donn�, alors le type est cr�� dans le sch�ma sp�cifi�. Sinon, il est cr�� dans le sch�ma courant. Le nom du type doit �tre distinct du nom des types ou domaines existants dans le m�me sch�ma. (Comme les tables ont des types de donn�es associ�s, le nom du type doit aussi �tre distinct du nom de toute table existante dans le m�me sch�ma.)

Types compos�s

La premi�re forme CREATE TYPE cr�e un type composite. Le type compos� est sp�cifi� par une liste de noms d'attributs et de types de donn�es. Ceci est essentiellement le m�me que le type row d'une table mais utiliser CREATE TYPE �vite le besoin de cr�er une table r�elle quand tout ce qui est souhait� est la d�finition d'un type. Un type composite autonome est utile comme type d'argument ou de retour d'une fonction.

Types de base

La seconde forme CREATE TYPE cr�e un nouveau type de base (type scalaire). Les param�tres pourraient appara�tre dans n'importe quel ordre, pas seulement celui illustr� ci-dessus, et la plupart sont optionnels. Vous devez enregistrer au moins deux fonctions (en utilisant CREATE FUNCTION) avant de d�finir le type. Les fonctions de support fonction_entr�e et fonction_sortie sont requises alors que les fonctions fonction_r�ception, fonction_envoi et fonction_analyze sont optionnelles. G�n�ralement, ces fonctions doivent �tre cod�es en C ou dans un autre langage de bas niveau.

La fonction_entr�e convertit la repr�sentation textuelle externe du type avec la repr�sentation interne utilis�e par les op�rateurs et fonctions d�finis pour le type. fonction_sortie r�alise la transformation inverse. La fonction en entr�e pourrait �tre d�clar�e comme prenant un argument de type cstring ou comme prenant trois arguments de types cstring, oid, integer. Le premier argument est le texte en entr�e en tant que cha�ne C, le second argument est l'OID du type d'�l�ment dans le cas o� il s'agit d'un type tableau (ou le propre OID du type pour un type composite) et le troisi�me est le typmod de la colonne destination, s'il est connu (-1 sinon). La fonction en entr�e devrait renvoyer une valeur du type de donn�es lui-m�me. La fonction en sortie pourrait �tre d�clar�e comme prenant un argument du nouveau type de donn�es ou comme prenant deux arguments dont le second est de type oid. Le second argument est de nouveau l'OID du type d'�l�ment de tableau pour les types tableau ou l'OID du type pour les types composites. La fonction de sortie devrait renvoyer le type cstring.

La fonction_r�ception optionnelle convertit la repr�sentation binaire externe du type vers la repr�sentation interne. Si cette fonction n'est pas fournie, le type ne peut pas participer � l'entr�e binaire. La repr�sentation binaire devrait �tre choisie pour �tre peu co�teuse sur la conversion vers la forme interne tout en �tant raisonnablement portable. (Par exemple, les types de donn�es standard entiers utilisent l'ordre r�seau des octets comme repr�sentation binaire externe alors que la repr�sentation interne est dans l'ordre natif des octets de la machine.) La fonction de r�ception devrait r�aliser des v�rifications ad�quates pour s'assurer que la valeur est valide. La fonction de r�ception pourrait �tre d�clar�e comme prenant un argument de type internal ou deux arguments de types internal et oid. Elle doit renvoyer une valeur de type de donn�es lui-m�me. (Le premier argument est un pointeur vers un tampon StringInfo contenant la cha�ne d'octets re�us ; le second argument optionnel est soit l'OID du type d'�l�ment dans le cas o� il s'agit d'un tableau soit le propre OID du type pour un type composite.) De fa�on similaire, la fonction_envoi optionnelle convertit � partir de la repr�sentation interne vers la repr�sentation binaire externe. Si cette fonction n'est pas fournie, le type ne peut pas participer dans la sortie binaire. La fonction d'envoi pourrait �tre d�clar�e comme prenant un argument du nouveau type de donn�es ou comme prenant deux arguments dont le second est de type oid. Le second argument est encore l'OID du type d'�l�ment du tableau pour les types tableau ou l'OID du type pour les types composites. La fonction d'envoi doit renvoyer le type bytea.

La fonction_analyse en option r�alise des r�cup�rations de statistiques sp�cifiques au type pour les colonnes de ce type de donn�es. Par d�faut, ANALYZE tentera de r�cup�rer des statistiques en utilisant les op�rateurs d'<<��galit�>> et d'<<�inf�riorit�>> du type, s'il existe une classe d'op�rateur par d�faut pour le B-tree de ce type. Pour les types non scalaires, ce comportement risque d'�tre moins convenable, donc il peut �tre surcharg� en indiquant une fonction d'analyse personnalis�e. La fonction d'analyse doit �tre d�clar�e comme prenant un seul argument de type internal et renvoyer un r�sultat de type boolean. L'API d�taill�e pour les fonctions d'analyses appara�t dans src/include/commands/vacuum.h.

Maintenant, vous devriez vous demander comment les fonctions d'entr�e et de sortie peuvent �tre d�clar�es pour avoir des r�sultats ou des arguments du nouveau type avant que le nouveau type soit cr��. La r�ponse est que la fonction en entr�e doit �tre cr��e en premier, puis la fonction de sortie (et les fonctions d'entr�es/sorties binaires si souhait�es) et enfin le type de donn�es. PostgreSQL verra tout d'abord le nom du nouveau type de donn�es comme type de retour de la fonction en entr�e. Il cr�era un type <<�shell�>>, qui est une simple entr�e d'emplacement dans le catalogue syst�me et lie la d�finition de fonction en entr�e au type de shell. De fa�on similaire, les autres fonctions seront li�es au (maintenant d�j� existant) type de shell. Enfin, CREATE TYPE remplace l'entr�e de shell avec une d�finition compl�te du type et le nouveau type peut �tre utilis�.

Alors que les d�tails de la repr�sentation interne du nouveau type sont seulement connus des fonctions d'entr�es/sorties et des autres fonctions que vous cr�ez pour travailler avec le type, il existe plusieurs propri�t�s de repr�sentation interne devant �tre d�clar�es � PostgreSQL. En premier lieu se trouve longueurinterne. Les types de donn�es de base peuvent avoir une longueur fixe auquel cas longueurinterne est un entier positif, ou une longueur variable, indiqu�e en initialisant longueurinterneVARIABLE. (En interne, ceci est repr�sent� en initialisant typlen � -1.) La repr�sentation interne de tous les types de longueur variable doit commencer avec un entier de quatre octets donnant la longueur totale de cette valeur du type.

Le drapeau optionnel PASSEDBYVALUE indique que les valeurs de ce type de donn�es sont pass�es par valeur plut�t que par r�f�rence. Vous pourriez ne pas passer par les types de valeurs dont la repr�sentation interne est plus importante que la taille du type Datum (quatre octets sur la plupart des machines, huit sur quelques-unes).

Le param�tre alignement sp�cifie l'alignement de stockage requis pour le type de donn�es. Les valeurs permises ont un alignement sur les limites de 1, 2, 4 ou 8 octets. Notez que les types de longueurs variables doivent avoir un alignement d'au moins quatre octets car ils contiennent n�cessairement un int4 comme premier composant.

Le param�tre stockage permet la s�lection de strat�gies de stockage pour des types de donn�es de longueur variable. (Seul plain est autoris� pour les types de longueur fixe.) plain sp�cifie que les donn�es du type seront toujours stock�es en ligne et non compress�es. extended sp�cifie que le syst�me essaiera tout d'abord de compresser une valeur longue de donn�es et d�placera la valeur en dehors de la ligne de la table principale si elle est trop longue. external permet � la valeur d'�tre d�plac�e hors de la table principale mais le syst�me ne tentera pas de la compresser. main autorise la compression mais d�courage le d�placement de la valeur en dehors de la table principale. (Les �l�ments de donn�es avec cette strat�gie de stockage pourraient toujours �tre d�plac�s hors de la table principale s'il n'y a pas d'autres moyens d'y placer une ligne mais ils seront conserv�s de pr�f�rence dans la table principale sur les �l�ments extended et external.)

Une valeur par d�faut pourrait �tre sp�cifi�e dans le cas o� l'utilisateur souhaite que les colonnes du type de donn�es aient pour valeur par d�faut une valeur autre que NULL. Sp�cifiez la valeur par d�faut avec le mot cl� DEFAULT. (Une telle valeur par d�faut peut �tre surcharg�e par une clause DEFAULT explicite attach�e dans une colonne particuli�re.)

Pour indiquer qu'un type est un tableau, sp�cifiez le type des �l�ments du tableau en utilisant le mot cl� ELEMENT. Par exemple, pour d�finir un tableau d'entiers de quatre octets (int4), sp�cifiez ELEMENT = int4. Plus de d�tails sur les types tableau apparaissent ci-dessous.

Pour indiquer le d�limiteur � utiliser entre les valeurs dans la repr�sentation externe des tableaux de ce type, d�limiteur peut �tre configur� � un caract�re particulier. Le d�limiteur par d�faut est la virgule (,). Notez que le d�limiteur est associ� avec le type d'�l�ment de tableau, pas le type tableau lui-m�me.

Types de tableaux

� chaque fois qu'un type de donn�es de base d�fini par un utilisateur est cr��, PostgreSQL cr�e automatiquement un type tableau associ� dont le nom consiste du nom du type de base pr�c�d� d'un tiret base. L'analyseur comprend cette convention de nommage et traduit les requ�tes pour les colonnes de type foo[] en requ�tes pour le type _foo. Le type tableau cr�� implicitement est de longueur variable et utilise les fonctions entr�e et sortie int�gr�e array_in et array_out.

Vous pourriez raisonnablement vous demander pourquoi il existe une option ELEMENT si le syst�me fabrique automatiquement le bon type tableau. Le seul cas o� il est utile d'utiliser ELEMENT est lorsque vous r�alisez un type de longueur fixe qui est en interne un tableau d'un nombre identique d'�l�ments et que vous souhaitez autoriser ces �l�ments � acc�der directement aux indices, en plus de toute autre op�ration que vous pensiez fournir pour le type dans sa globalit�. Par exemple, le type name permet � ses �l�ments char constituants d'�tre accessible de cette fa�on. Un type point en 2-D pourrait autoriser les deux num�ros de composant � �tre acc�d� ainsi : point[0] et point[1]. Notez que cette fonctionnalit� fonctionne uniquement avec les types de longueur fixe dont la forme interne est exactement une s�quence de champs de longueur variable. Un type longueur de variable � indice doit avoir la repr�sentation interne g�n�ralis�e utilis�e par array_in et array_out. Pour des raisons historiques (c'est-�-dire qu'il est clairement mauvais parce qu'il est trop tard pour changer) s'abonner � des types de longueur variable commence � partir de z�ro plut�t que de un pour les tableaux de longueur variable.

Param�tres

nom

Le nom d'un type � cr�er (pouvant �tre qualifi� par le nom du sch�ma).

nom_attribut

Le nom d'un attribut (colonne) pour le type compos�.

type_donn�es

Le nom d'un type de donn�es existant qui deviendra une colonne du type compos�.

fonction_entr�e

Le nom d'une fonction qui convertit les donn�es � partir de la forme textuelle externe du type en sa forme interne.

fonction_sortie

Le nom d'une fonction qui convertit les donn�es � partir de la forme interne du type dans sa forme textuelle externe.

fonction_r�ception

Le nom d'une fonction qui convertit la forme binaire externe du type dans sa forme interne.

fonction_envoi

Le nom d'une fonction qui convertit les donn�es � partir de la forme interne du type dans sa forme binaire externe.

analyze_function

Le nom d'une fonction qui r�alise des analyses statistiques pour le type de donn�es.

longueurinterne

Une constante num�rique qui sp�cifie la longueur en octets de la repr�sentation interne du nouveau type. La supposition par d�faut est que la longueur est variable.

alignement

Le besoin d'alignement du stockage du type de donn�es. Si sp�cifi�, il doit �tre parmi char, int2, int4 ou double ; par d�faut, il s'agit d'int4.

stockage

La strat�gie de stockage pour le type de donn�es. Si sp�cifi�e, elle doit faire partie de plain, external, extended ou main ; la valeur par d�faut est plain.

d�faut

La valeur par d�faut pour le type de donn�es. Si elle est omise, elle est NULL.

�l�ment

Le type en cours de cr�ation est un tableau ; ceci sp�cifie le type des �l�ments du tableau.

d�limiteur

Le caract�re d�limiteur � utiliser entre les valeurs des tableaux de ce type.

Notes

Les noms de types d�finis par l'utilisateur ne peuvent pas commencer avec un tiret bas (_) et ont une longueur maximale de 62 caract�res (ou en g�n�ral NAMEDATALEN - 2, plut�t que NAMEDATALEN - 1 caract�res autoris�s pour les autres noms). Les noms de types commen�ant avec un tiret bas sont r�serv�s par les noms de type tableau cr��s en interne.

Dans les versions de PostgreSQL ant�rieures � la 7.3, il �tait coutumier d'�viter de cr�er un type shell en rempla�ant les r�f�rences des fonctions au nom du type avec le pseudotype opaque. Les arguments cstring et les r�sultats doivent aussi �tre d�clar�s comme opaque avant la 7.3. Pour supporter le chargement d'anciens fichiers de sauvegarde, CREATE TYPE acceptera les fonctions d�clar�es avec opaque mais il affichera un message d'avertissement et modifiera la d�claration de la fonction pour utiliser les bons types.

Exemples

Cet exemple cr�e un type composite et l'utilise dans la d�finition d'une fonction :

CREATE TYPE compfoo AS (f1 int, f2 text);

CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;

Cet exemple cr�e le type de donn�es de base box, puis l'utilise dans une d�finition de table :

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = ma_fonction_entree_box,
    OUTPUT = ma_fonction_sortie_box
);

CREATE TABLE myboxes (
    id integer,
    description box
);

Si la structure interne de box �tait un tableau de quatre �l�ments float4, nous pourrions faire

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = ma_fonction_entree_box,
    OUTPUT = ma_fonction_sortie_box,
    ELEMENT = float4
);

ce qui permettrait un acc�s aux nombres composant la valeur d'une bo�te avec les indices. Sinon, le type se comporte de la m�me fa�on qu'avant.

Cet exemple cr�e un objet large et l'utilise dans une d�finition de table :

CREATE TYPE bigobj (
    INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
    id integer,
    obj bigobj
);

Vous trouverez plus d'exemples, int�grant des fonctions int�ressantes en entr�e et en sortie, dans Section 31.11.

Compatibilit�

Cette commande CREATE TYPE est une extension PostgreSQL. Il existe une instruction CREATE TYPE dans SQL:1999 et ses versions ult�rieures qui est plut�t diff�rente dans le d�tail.

Voir aussi

CREATE FUNCTION, DROP TYPE, ALTER TYPE