CREATE AGGREGATE nome ( BASETYPE = tipo_de_dado_da_entrada, SFUNC = função_de_transição_de_estado, STYPE = tipo_de_dado_do_estado [ , FINALFUNC = função_final ] [ , INITCOND = condição_inicial ] )
O comando CREATE AGGREGATE cria uma função de agregação. Algumas funções de agregação para tipos base, como min(integer)
e avg(double precision)
são fornecidas na distribuição padrão. Se forem criados tipos novos, ou se houver necessidade de uma função de agregação não fornecida, então o comando CREATE AGGREGATE pode ser utilizado para fornecer as funcionalidades desejadas.
Se for fornecido o nome do esquema (por exemplo, CREATE AGGREGATE meu_esquema.minha_agregacao ...) então a função de agregação é criada no esquema especificado, senão é criada no esquema corrente.
Uma função de agregação é identificada pelo seu nome e tipo de dado de entrada. Duas funções de agregação no mesmo esquema podem ter o mesmo nome se operarem em tipos de dado de entrada diferentes. O nome e tipo de dado de entrada de uma função de agregação também deve ser diferente do nome e tipo(s) de dado de entrada de todas as funções comuns no mesmo esquema.
Uma função de agregação é composta por uma ou duas funções comuns: uma função de transição de estado, função_de_transição_de_estado, e uma função opcional para a realização dos cálculos finais, função_final. Estas funções são utilizadas da seguinte forma:
função_de_transição_de_estado( estado-interno, próximo-item-de-dado ) ---> próximo-estado-interno função_final( estado-interno ) ---> valor-da-agregação
O PostgreSQL cria uma variável temporária com o tipo de dado tipo_de_dado_do_estado para armazenar o estado interno corrente da agregação. Para cada item de dado da entrada a função de transição de estado é chamada para calcular o novo valor do estado interno. Após todos os dados terem sido processados, a função final é chamada uma vez para calcular o valor retornado da agregação. Não havendo nenhuma função final, então o valor do estado final é retornado como estiver.
A função de agregação pode fornecer uma condição inicial, ou seja, um valor inicial para o valor do estado interno. Este valor é especificado e armazenado no banco de dados em uma coluna do tipo text, mas deve possuir uma representação externa válida para uma constante do tipo de dado do valor do estado. Se não for fornecido, então o valor do estado começa com nulo.
Se a função de transição de estado for declarada como "strict", então não poderá ser chamada com valores da entrada nulos. Para este tipo de função de transição, a execução da agregação se comporta da seguinte forma: Valores da entrada nulos são ignorados (a função não é chamada e o valor do estado anterior permanece); Se o valor do estado inicial for nulo, então o primeiro valor da entrada que não for nulo substitui o valor do estado, e a função de transição é chamada a partir do segundo valor da entrada que não for nulo. Este procedimento é útil para implementar funções de agregação como max
. Deve ser observado que este comportamento somente está disponível quando o tipo_de_dado_do_estado for o mesmo do tipo_de_dado_da_entrada. Quando estes tipos de dado forem diferentes, deverá ser fornecido um valor não nulo para a condição inicial, ou utilizar uma função de transição que não seja estrita.
Se a função de transição de estado não for estrita então será chamada, incondicionalmente, para cada valor da entrada, devendo ser capaz de lidar com entradas nulas e valores de transição nulos por si própria. Esta opção permite ao autor da função de agregação ter pleno controle sobre o tratamento dos valores nulos.
Se a função final for declarada como "strict", então não será chamada quando o valor do estado final for nulo; em vez disso, um resultado nulo será retornado automaticamente (É claro que este é apenas o comportamento normal de funções estritas
[1]
). A função final sempre tem a opção de retornar o valor nulo. Por exemplo, a função final para avg
retorna nulo quando não há linhas de entrada.
count(*)
).
Os parâmetros para CREATE AGGREGATE podem ser escritos em qualquer ordem, e não apenas na ordem mostrada acima.
O comando CREATE AGGREGATE é uma extensão do PostgreSQL à linguagem. O padrão SQL não inclui funções de agregação definidas pelo usuário.
[1] |
strict — A função f é estrita em um argumento se "f bottom = bottom". Em outras palavras, o resultado depende do argumento e, portanto, a avaliação da aplicação da função não pode terminar enquanto a avaliação do argumento não tenha terminado. FOLDOC - Free On-Line Dictionary of Computing (N. do T.) |