CREATE AGGREGATE

Name

CREATE AGGREGATE  --  Définit une nouvelle fonction agrégat

Synopsis

CREATE AGGREGATE name ( BASETYPE = input_data_type,
    SFUNC = sfunc, STYPE = state_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ] )
  

Entrées

name

Nom d'une fonction agrégat à créer.

input_data_type

Le type d'entrée sur lequel cette fonction agrégat opère. Ce peut être spécifié avec ANY pour un agrégat qui n'examine pas ses valeurs d'entrée (un exemple est count(*)).

sfunc

Le nom de la fonction de transition d'état à appeler pour chaque valeur d'entrée. C'est normalement une fonction à deux arguments, le premier étant de type state_type and the second ofwet le second de type input_data_type. Alternativement, pour un agrégat qui n'examine pas ses valeurs d'entrée la fonction prend juste un argument de type state_type. Dans un autre cas la fonction doit retourner une valeur de type state_type. Cette fonction prend la valeur d'état courante et l'item d'entrée courant, et retourne la valeur d'état suivante.

state_type

Le type pour la valeur agrégat d'état.

ffunc

Le nom de la fonction finale appelée pour calculer le résultat de l'agrégat après que toutes les entrées aient été parcourues. La fonction doit prendre un seul argument de type state_type. Le type sortie de l'agrégat est défini comme le type retour de cette fonction. Si ffunc n'est pas spécifié, alors la valeur d'état finale est utilisée comme résultat de l'agrégat, et le type de sortie est state_type.

initial_condition

Le placement initial pour la valeur d'état. Ça doit être une constante littérale dans la forme acceptée pour le type state_type. Si non spécifié, la valeur d'état prend NULL.

Sorties

CREATE

Message de retour si la commande s'est exécutée correctement.

Description

CREATE AGGREGATE permet à l'utilisateur ou au programmeur d'étendre les fonctionnalités de Postgres en définissant de nouvelles fonctions agrégats. Certaines fonctions agrégats de type base comme min(integer) et avg(double precision) sont déja fournies dans la distribution de base. Si quelqu'un défini de nouveaux types ou a besoin d'une fonction agrégat pas encore fournie, CREATE AGGREGATE peut être utilisé pour fournir ces fonctionnalités.

Une fonction agrégat est identifiée par son nom et son type d'entrée. Deux agrégats peuvent avoir le même nom s'ils opèrent sur des types d'entrée différents. Pour éviter la confusion, évitez de créer une fonction ordinaire de même nom et de même type d'entrée qu'un agrégat.

Une fonction agrégat est faite pour une ou deux fonctions ordinaires : une fonction de transition d'état sfunc, et une fonction optionnelle de calcul final ffunc. Elles sont utilisées comme suit :

sfunc( internal-state, next-data-item ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value
   

PostgreSQL crée une variable temporaire de type stype pour maintenir l'état interne courant de l'agrégat. À chaque item d'entrée la fonction de transition d'état est invoquée pour calculer la valeur d'état interne. Après que toutes les données aient été traitées la fonction finale est invoquée pour calculer la valeur de sortie de l'agrégat. S'il n'y a pas de fonction finale la valeur d'état de fin est retournée telle quelle.

Une fonction agrégat peut fournir une condition initiale, qui est, une valeur initiale pour la valeur d'état interne. Ceci est spécifié et stocké dans la base comme champ de type text, mais ce doit être une représentation externe valide d'une constante de type valeur d'état. Si elle n'est pas fournie la valeur d'état prend NULL.

Si la fonction de transition d'état est déclarée "strict", elle ne peut pas être appelée avec des entrées NULL. Avec ce genre de fonction de transition, l'exécution de l'agrégat se comporte comme suit. Les valeurs d'entrée NULL sont ignorées (la fonction n'est pas appelée et la valeur d'état précédente est est retenue). Si la valeur initiale d'état est NULL, la première valeur entrée non-NULL remplace la valeur d'état, et la fonction de transition est invoquée en commençant avec la seconde valeur d'entrée non-NULL. C'est pratique pour implémenter les agrégats comme max. Notez que ce comportement n'est disponible que lorsque state_type est identique à input_data_type. Quand ces types sont différents, vous devez fournir une condition initiale non-NULL ou utiliser une fonction de transition non-strict.

Si la fonction de transition d'état est non-stricte, elle sera appelée inconditionnellement à chaque valeur d'entrée, et doit négocier avec des entrées NULL et des valeur de transition NULL pour elle-même. Ceci permet à l'auteur de l'agrégat d'avoir un contrôle complet des NULL dans le maniement des agrégats.

Si la fonction finale est déclarée "strict", elle ne sera pas appelée quand la valeur d'état finale est NULL; au lieu d'un résultat NULL ce sera automatiquement une sortie. (Bien sûr c'est juste le comportement normal des fonctions strictes). Dans certains cas la fonction finale a l'option de retour NULL. Par exemple, la fonction finale pour avg renvoie NULL quand elle voit qu'il y a zero tuple en entrée.

Notes

Utilisez DROP AGGREGATE pour suprimer les fonctions agrégats.

Les paramètres de CREATE AGGREGATE peuvent être écrits dans n'importe quel ordre, pas forcément l'ordre indiqué ci-dessus.

Utilisation

Voir le chapitre sur les fonctions agrégats dans le Guide du programmeur PostgreSQL pour des exemples complets sur l'utilisation.

Compatibilité

SQL92

CREATE AGGREGATE est une extension du langage PostgreSQL. Il n'y a pas de CREATE AGGREGATE en SQL92.