8.21. Pseudotipos #

O sistema de tipos de dados do PostgreSQL contém várias entradas de propósito especial, chamadas coletivamente de pseudotipos. Um pseudotipo não pode ser usado como tipo de dados de coluna, mas pode ser usado para declarar o argumento ou o tipo de dados do resultado de uma função. Cada um dos pseudotipos disponíveis é útil em situações onde o comportamento de uma função não corresponde a apenas aceitar ou retornar o valor de um determinado tipo de dados do SQL. A Tabela 8.27 lista os pseudotipos existentes.

Tabela 8.27. Pseudotipos

NomeDescrição
anyIndica que a função aceita qualquer tipo de dados de entrada.
anyelementIndica que a função aceita qualquer tipo de dados (veja a Seção 36.2.5).
anyarrayIndica que a função aceita qualquer tipo de dados matriz (veja a Seção 36.2.5).
anynonarrayIndica que a função aceita qualquer tipo de dados não-matriz (veja a Seção 36.2.5).
anyenumIndica que a função aceita qualquer tipo de dados enum (veja a Seção 36.2.5 e Seção 8.7).
anyrangeIndica que a função aceita qualquer tipo de dados de intervalo (veja a Seção 36.2.5 e Seção 8.17).
anymultirangeIndica que a função aceita qualquer tipo de dados multi-intervalo (veja a Seção 36.2.5 e Seção 8.17).
anycompatibleIndica que a função aceita qualquer tipo de dados, com promoção automática dos vários argumentos para um tipo de dados comum (veja a Seção 36.2.5).
anycompatiblearrayIndica que a função aceita qualquer tipo de dados matriz, com promoção automática dos vários argumentos para um tipo de dados comum (veja a Seção 36.2.5).
anycompatiblenonarrayIndica que a função aceita qualquer tipo de dados não-matriz, com promoção automática dos vários argumentos para um tipo de dados comum (veja a Seção 36.2.5).
anycompatiblerangeIndica que a função aceita qualquer tipo de dados de intervalo, com promoção automática dos vários argumentos para um tipo de dados comum (veja a Seção 36.2.5 e a Seção 8.17).
anycompatiblemultirangeIndica que a função aceita qualquer tipo de dados multi-intervalo, com promoção automática dos vários argumentos para um tipo de dados comum (veja a Seção 36.2.5 e a Seção 8.17).
cstringIndica que uma função aceita ou retorna uma cadeia de caracteres C terminada em nulo.
internalIndica que uma função aceita ou retorna um tipo de dados interno do servidor.
language_handlerUm tratador (handler) de chamada de linguagem procedural é declarado retornando um language_handler.
fdw_handlerUm tratador (handler) de empacotador de dados estrangeiros (foreign-data wrapper) é declarado retornando um fdw_handler.
table_am_handlerUm tratador (handler) de método de acesso a tabela é declarado retornando table_am_handler.
index_am_handlerUm tratador (handler) de método de acesso a índice é declarado retornando index_am_handler.
tsm_handlerUm tratador (handler) de método de amostragem de tabela é declarado retornando tsm_handler.
recordIdentifica uma função que aceita ou retorna um tipo de dados linha [a] não especificado.
triggerUma função de gatilho é declarada retornando trigger.
event_triggerUma função de gatilho de evento é declarada retornando event_trigger.
pg_ddl_commandIdentifica uma representação de comandos DDL que está disponível para gatilhos de eventos.
voidIndica que a função não retorna nenhum valor.
unknownIdentifica um tipo de dados ainda não resolvido, por exemplo, de um literal cadeia de caracteres sem delimitadores.

[a] Um tipo de dados linha é uma sequência de pares (<nome do campo> <tipo de dados>), chamados campos. ISO/IEC 9075-2:1999 (E) – 4.9 Row types (N. T.)


Funções escritas em C (sejam incorporadas ou carregadas dinamicamente) podem ser declaradas como aceitando ou retornando qualquer um desses pseudotipos. Cabe ao autor da função garantir que a função se comporte com segurança quando um pseudotipo é usado como tipo de dados do argumento.

Funções codificadas em linguagens procedurais podem usar pseudotipos apenas conforme seja permitido por suas linguagens de implementação. No momento, a maioria das linguagens procedurais proíbe o uso de pseudotipo como tipo de dados de argumento, permitindo apenas void e record como tipo de dados de resultado (além de trigger ou event_trigger quando a função é usada como gatilho, ou gatilho de evento). Algumas linguagens também dão suporte a funções polimórficas usando os pseudotipos polimórficos mostrados acima, e discutidos em detalhes na Seção 36.2.5.

O pseudotipo internal é usado para declarar funções que devem ser chamadas apenas internamente pelo sistema de banco de dados, e não por chamada direta em uma consulta SQL. Se a função tem pelo menos um argumento do tipo de dados internal, então ela não pode ser chamada a partir do SQL. Para preservar a segurança de tipo de dados dessa restrição é importante seguir essa regra de codificação: não criar nenhuma função retornando internal, a menos que tenha pelo menos um argumento internal.