Os comandos SQL podem, intencionalmente ou não, usar tipos de dado diferentes na mesma expressão. O PostgreSQL possui muitas funcionalidades para processar expressões com mistura de tipos.
Em muitos casos não há necessidade do usuário compreender os detalhes do mecanismo de conversão de tipo. Entretanto, as conversões implícitas feitas pelo PostgreSQL podem afetar o resultado do comando. Quando for necessário, os resultados podem ser personalizados utilizando uma conversão de tipo explícita.
Este capítulo apresenta os mecanismos e as convenções de conversão de tipo de dado do PostgreSQL. Consulte as seções relevantes no Capítulo 8 e no Capítulo 9 para obter mais informações sobre tipos de dado específicos, e funções e operadores permitidos, respectivamente.
A linguagem SQL é uma linguagem fortemente tipada, ou seja, todo item de dado possui um tipo de dado associado que determina seu comportamento e a utilização permitida. O PostgreSQL possui um sistema de tipo de dado extensível, muito mais geral e flexível do que o de outras implementações do SQL. Por isso, a maior parte do comportamento de conversão de tipo de dado do PostgreSQL é governado por regras gerais, em vez de heurísticas [1] ad hoc [2] , permitindo, assim, expressões com tipos diferentes terem significado mesmo com tipos definidos pelo usuário.
O rastreador/analisador (scanner/parser) do PostgreSQL divide os elementos léxicos em apenas cinco categorias fundamentais: inteiros, números não inteiros, cadeias de caracteres, identificadores e palavras chave. As constantes dos tipos não numéricos são, em sua maioria, classificadas inicialmente como cadeias de caracteres. A definição da linguagem SQL permite especificar o nome do tipo juntamente com a cadeia de caracteres, e este mecanismo pode ser utilizado no PostgreSQL para colocar o analisador no caminho correto. Por exemplo, a consulta
=> SELECT text 'Origem' AS "local", point '(0,0)' AS "valor"; local | valor --------+------- Origem | (0,0) (1 linha)
possui duas constantes literais, dos tipos text e point. Se o tipo do literal cadeia de caracteres não for especificado, inicialmente é atribuído o tipo provisório unknown (desconhecido), a ser determinado posteriormente nos estágios descritos abaixo.
Existem quatro construções SQL fundamentais que requerem regras de conversão de tipo distintas no analisador do PostgreSQL:
Os catálogos do sistema armazenam informações sobre que conversões entre tipos de dado, chamadas de casts, são válidas, e como realizar estas conversões. Novas conversões podem ser adicionadas pelo usuário através do comando CREATE CAST (Geralmente isto é feito junto com a definição de novos tipos de dado. O conjunto de conversões entre os tipos nativos foi cuidadosamente elaborado, sendo melhor não alterá-lo).
É fornecida no analisador uma heurística adicional para permitir estimar melhor o comportamento apropriado para os tipos do padrão SQL. Existem diversas categorias de tipo básicas definidas: boolean, numeric, string, bitstring, datetime, timespan, geometric, network e a definida pelo usuário. Cada categoria, com exceção da definida pelo usuário, possui um ou mais tipo preferido, selecionado preferencialmente quando há ambigüidade. Na categoria definida pelo usuário, cada tipo é o seu próprio tipo preferido. As expressões ambíguas (àquelas com várias soluções de análise candidatas) geralmente podem, portanto, serem resolvidas quando existem vários tipos nativos possíveis, mas geram erro quando existem várias escolhas para tipos definidos pelo usuário.
Todas as regras de conversão de tipo foram projetadas com vários princípios em mente:
[1] |
heurística — conjunto de regras e métodos que conduzem à descoberta, à invenção e à resolução de problemas. Novo Dicionário Aurélio da Língua Portuguesa. (N. do T.) |
[2] |
ad hoc — para isso, para esse caso. Novo Dicionário Aurélio da Língua Portuguesa. (N. do T.) |