4.1. Estrutura léxica #

4.1.1. Identificadores e palavras-chave
4.1.2. Constantes
4.1.3. Operadores
4.1.4. Caracteres especiais
4.1.5. Comentários
4.1.6. Precedência dos operadores

Uma entrada SQL consiste em uma sequência de comandos. Um comando é formado por uma sequência de tokens [14] terminada por um ponto-e-vírgula (;). O fim do fluxo de entrada também termina o comando. Quais tokens são válidos depende da sintaxe particular de cada comando.

Um token pode ser uma palavra-chave, um identificador, um identificador entre aspas [15], um literal (ou constante) [16] ou um caractere especial. Normalmente os tokens são separados por espaço em branco (espaço, tabulação ou nova-linha), mas não há necessidade caso não haja ambiguidade (o que geralmente só acontece quando um caractere especial está adjacente a outro tipo de token).

Por exemplo, o que vem a seguir é válido (sintaticamente) para uma entrada SQL:

SELECT * FROM MINHA_TABELA;
UPDATE MINHA_TABELA SET A = 5;
INSERT INTO MINHA_TABELA VALUES (3, 'oi você');

Esta é uma sequência de três comandos, um por linha (embora isso não seja requerido, podendo haver mais de um comando na mesma linha, mesmo assim pode ser útil dividir um comando em várias linhas).

Além disso, as entradas SQL podem conter comentários. Eles não são tokens, na verdade, são equivalentes a espaço em branco.

A sintaxe do SQL não é muito consistente em relação a quais tokens identificam comandos, e quais são operandos ou parâmetros. Os primeiros tokens são geralmente o nome do comando; portanto, no exemplo mostrado acima, pode-se dizer que estão presentes os comandos SELECT, UPDATE e INSERT. Mas, por exemplo, o comando UPDATE sempre requer que um token SET apareça em uma determinada posição, e essa forma particular do comando INSERT também requer a presença de VALUES para estar completa. As regras precisas da sintaxe de cada comando estão descritas na Parte VI.

4.1.1. Identificadores e palavras-chave #

Tokens tais como SELECT, UPDATE, ou VALUES no exemplo acima são exemplos de palavras-chave, ou seja, palavras que têm um significado fixo na linguagem SQL. Os tokens MINHA_TABELA e A são exemplos de identificadores [17]. Eles identificam nomes de tabelas, colunas ou de outros objetos do banco de dados, dependendo do comando em que são usados. Portanto, algumas vezes são chamados apenas de nomes. Palavras-chave são identificadores que possuem a mesma estrutura léxica, significando não ser possível saber se o token é um identificador ou uma palavra-chave, sem conhecer a linguagem. A relação completa das palavras-chave pode ser encontrada no Apêndice C.

Os identificadores e as palavras-chave do SQL devem iniciar por uma letra (a-z e, também, letras com diacrítico [18] [19] - áõç... - e letras não latinas) ou o caractere sublinhado (_). Os caracteres subsequentes de um identificador, ou da palavra-chave, podem ser letras, sublinhados, dígitos (0-9) ou o cifrão ($). Note que, segundo o padrão SQL, o cifrão não é permitido em identificadores; portanto, seu uso pode tornar a aplicação menos portável. O padrão SQL não irá definir palavras-chave contendo dígitos, ou começando, ou terminando, por sublinhado, portanto os identificadores com essa forma estão a salvo contra possíveis conflitos com extensões futuras do padrão.

O sistema não utiliza mais que NAMEDATALEN-1 bytes do identificador; podem ser escritos nomes mais longos nos comandos, mas são truncados. Por padrão, NAMEDATALEN é igual a 64; portanto, o comprimento máximo do identificador é de 63 bytes. Se esse limite causar problema, pode ser aumentado modificando a constante NAMEDATALEN no arquivo src/include/pg_config_manual.h.

Palavras-chave e identificadores sem aspas não fazem distinção entre letras maiúsculas e minúsculas. Portanto:

UPDATE MINHA_TABELA SET A = 5;

pode ser escrito de forma equivalente como:

uPDaTE minha_TaBela SeT a = 5;

Uma convenção comumente usada é escrever as palavras-chave em maiúsculas e os nomes em minúsculas, como mostrado abaixo:

UPDATE minha_tabela SET a = 5;

Existe um segundo tipo de identificador: o identificador delimitado, ou identificador entre aspas, formado pela colocação de uma sequência arbitrária de caracteres entre aspas ("). Um identificador delimitado é sempre um identificador, e nunca uma palavra-chave. Portanto, "select" pode ser usado para fazer referência a uma coluna ou tabela chamada "select", enquanto select sem aspas é sempre uma palavra-chave, ocasionando, por isso, erro do analisador quando usada onde é esperado um nome de tabela ou de coluna. O exemplo acima pode ser reescrito utilizando identificadores entre aspas, como mostrado abaixo:

UPDATE "minha_tabela" SET "a" = 5;

Identificadores entre aspas podem conter qualquer caractere que não seja a própria aspa (Para incluir uma aspa, devem ser escritas duas aspas). Isso permite criar nomes de tabelas e de colunas que não seriam possíveis de outra forma, como os contendo espaços ou e-comercial (&). O limite do comprimento ainda se aplica.

Envolver um identificador por aspas torna-o sensível a maiúsculas e minúsculas, enquanto os nomes não envoltos por aspas são sempre convertidas para minúsculas. Por exemplo, os identificadores FOO, foo e "foo" são considerados o mesmo identificador pelo PostgreSQL, mas "Foo" e "FOO" são diferentes dos três primeiros, e entre si. (A conversão dos nomes que não estão entre aspas em minúsculas no PostgreSQL é incompatível com o padrão SQL, que define que os nomes não envoltos por aspas devem ser convertidos para maiúsculas. Portanto, foo deveria ser equivalente a "FOO", e não a "foo", segundo o padrão. Se for desejado escrever aplicações portáveis, é recomendável colocar um determinado nome sempre entre aspas, ou nunca o colocar entre aspas.)

Uma forma alternativa de identificadores entre aspas permite incluir caracteres Unicode com escape identificados por seus pontos de código. [20] Esta forma alternativa começa por U& (U maiúsculo ou minúsculo seguido por e-comercial) logo antes da aspa de abertura, sem espaços entre eles, por exemplo, U&"foo". (Note que isso cria uma ambiguidade com o operador &. Devem ser colocados espaços em torno do operador para evitar esse problema.) Dentro das aspas, os caracteres Unicode podem ser especificados em forma de escape, escrevendo uma contrabarra (\) seguida pelo número de ponto de código hexadecimal de quatro dígitos ou, como alternativa, uma contrabarra seguida por um sinal de mais seguido por um número de ponto de código hexadecimal de seis dígitos. Por exemplo, o identificador "data" pode ser escrito como:

U&"d\0061t\+000061"

O seguinte exemplo, menos trivial, escreve a palavra russa slon (elefante) no alfabeto cirílico:

U&"\0441\043B\043E\043D"

Se for desejado usar um caractere de escape diferente da contrabarra, esse pode ser especificado usando a cláusula UESCAPE após a cadeia de caracteres. Por exemplo:

U&"d!0061t!+000061" UESCAPE '!'

O caractere de escape pode ser qualquer caractere que não seja um dígito hexadecimal, o sinal de mais, aspas, apóstrofos, ou um caractere de espaço em branco. Note que o caractere de escape é escrito entre apóstrofos ('), e não entre aspas ("), após UESCAPE.

Para incluir o caractere de escape no identificador sem interpretação, escreva-o duas vezes.

Tanto a forma de escape de 4 dígitos quanto a de 6 dígitos podem ser usadas para especificar pares substitutos [21] UTF-16, compondo assim caracteres com pontos de código maiores que U+FFFF, embora a disponibilidade da forma de 6 dígitos tecnicamente torne isso desnecessário. (Os pares substitutos não são armazenados diretamente, mas são combinados em um único ponto de código.)

Se a codificação do servidor não for UTF-8, o ponto de código Unicode identificado por uma destas sequências de escape será convertido na codificação do servidor em atividade; será relatado um erro se isso não for possível.

4.1.2. Constantes #

Existem três tipos de constante com tipo implícito no PostgreSQL: cadeias de caracteres, cadeias de bits e números. As constantes também podem ser definidas com tipo explícito, permitindo uma representação mais precisa e um tratamento mais eficiente por parte do sistema. Essas alternativas estão discutidas nas próximas subseções.

4.1.2.1. Constantes do tipo cadeia de caracteres #

Uma constante do tipo cadeia de caracteres no SQL é uma sequência arbitrária de caracteres entre apóstrofos (') como, por exemplo, 'Essa é uma cadeia de caracteres'. Para incluir um apóstrofo dentro da constante do tipo cadeia de caracteres, devem ser escritos dois apóstrofos adjacentes como, por exemplo, 'Maria D''Almeida'. Note que esse não é o mesmo caractere aspas (") usado nos identificadores delimitados.

Duas constantes do tipo cadeia de caracteres separadas apenas por espaços em branco com pelo menos um caractere de nova-linha, são concatenadas e tratadas de fato como se toda a cadeia de caracteres tivesse sido escrita em uma única constante. Por exemplo:

SELECT 'foo'
'bar';

equivale a:

SELECT 'foobar';

mas:

SELECT 'foo'      'bar';

não é uma sintaxe válida (esse comportamento, um tanto ao quanto estranho, é especificado pelo padrão SQL; o PostgreSQL está seguindo o padrão).

4.1.2.2. Constantes do tipo cadeia de caracteres com escapes no estilo-C #

O PostgreSQL também aceita constantes cadeias de caracteres utilizando escape, que é uma extensão do padrão SQL. Uma constante cadeia de caracteres com escape é definida escrevendo a letra E (maiúscula ou minúscula) logo antes do apóstrofo de abertura, por exemplo, E'foo'. (Ao continuar uma constante cadeia de caracteres com escape em outra linha, escreva E somente antes do primeiro apóstrofo de abertura.) Dentro da cadeia de caracteres com escape, um caractere de contrabarra (\) inicia um escape de contrabarra estilo-C, onde a combinação da contrabarra com o(s) caractere(s) seguinte(s) representam um valor de byte especial, conforme mostrado na Tabela 4.1. [22]

Tabela 4.1. Sequências de escape de contrabarra

Sequência de escape de contrabarraInterpretação
\bretrocesso (backspace)
\favanço de formulário (form feed)
\nnova linha (newline)
\rretorno de carro (carriage return)
\ttabulação (tab)
\o, \oo, \ooo (o = 0–7) valor do byte em notação octal
\xh, \xhh (h = 0–9, A–F) valor do byte em notação hexadecimal
\uxxxx, \Uxxxxxxxx (x = 0–9, A–F) caractere Unicode em notação hexadecimal de 16 ou 32-bits

Qualquer outro caractere após a contrabarra é tomado literalmente. Portanto, para incluir um caractere de contrabarra, devem ser escritas duas contrabarras (\\). Também pode ser incluído o apóstrofo na cadeia de caracteres com escape escrevendo-se \', além da maneira normal ''. Exemplo: [23]

SELECT E'a\nc' AS "Nova linha",
       E'a\bc' AS "Backspace",
       E'a\'c' AS "Apóstrofo 1",
       E'a''c' AS "Apóstrofo 2",
       E'a\\c' AS "Contrabarra";

 Nova linha | Backspace | Apóstrofo 1 | Apóstrofo 2 | Contrabarra
------------+-----------+-------------+-------------+-------------
 a         +| a\x08c    | a'c         | a'c         | a\c
 c          |           |             |             |
(1 linha)

É de sua responsabilidade que as sequências de bytes que você cria, principalmente quando você usa escapes octais ou hexadecimais, que essas sequências tenham caracteres válidos na codificação do conjunto de caracteres do servidor. Uma alternativa útil é usar escapes Unicode, ou a sintaxe alternativa de escape Unicode, explicada em Constantes do tipo cadeia de caracteres com escapes Unicode; dessa maneira o servidor irá verificar se a conversão de caracteres é possível.

Cuidado

Se o parâmetro de configuração standard_conforming_strings estiver desativado (off), o PostgreSQL reconhecerá escapes de contrabarra em constantes cadeias de caracteres regular e de escape. No entanto, a partir do PostgreSQL 9.1, o padrão passou a ser ativado (on), significando que os escapes de contrabarra são reconhecidos apenas em constantes do tipo cadeia de caracteres de escape. Esse comportamento é mais próximo do padrão SQL, mas pode causar problemas em aplicações que dependem do comportamento histórico, onde os escapes de contrabarra sempre foram reconhecidos. Como solução alternativa, esse parâmetro pode ser definido como desativado, mas é preferível não usar escapes de contrabarra. Se for necessário usar escape de contrabarra para representar um caractere especial, a constante do tipo cadeia de caracteres deve ser escrita com um E na frente.

Além do standard_conforming_strings, os parâmetros de configuração escape_string_warning e backslash_quote controlam o tratamento das contrabarras em constantes do tipo cadeia de caracteres.

O caractere com o código zero não pode estar presente em uma constante do tipo cadeia de caracteres de escape. Exemplo: [24]

SELECT E'A\x00B';
ERRO:  sequência de bytes é inválida para codificação "UTF8": 0x00

4.1.2.3. Constantes do tipo cadeia de caracteres com escapes Unicode #

O PostgreSQL também aceita outro tipo de sintaxe de escape para cadeias de caracteres, que permite especificar caracteres Unicode arbitrários por ponto de código. Uma constante do tipo cadeia de caracteres de escape Unicode começa por U& (letra maiúscula ou minúscula U, seguida por e-comercial) logo antes do apóstrofo de abertura, sem espaços entre eles, por exemplo, U&'foo'. (Note que isso cria uma ambiguidade com o operador &. Use espaços em torno do operador para evitar esse problema.) Dentro dos apóstrofos, os caracteres Unicode podem ser especificados em forma de escape escrevendo uma contrabarra seguida pelo número de ponto de código hexadecimal de quatro dígitos ou, como alternativa, uma contrabarra seguida por um sinal de mais (+), seguido por um número de ponto de código hexadecimal de seis dígitos. Por exemplo, a cadeia de caracteres 'data' pode ser escrita como:

U&'d\0061t\+000061'

O seguinte exemplo, menos trivial, escreve a palavra russa slon (elefante) em letras cirílicas:

U&'\0441\043B\043E\043D'

Se for desejado usar um caractere de escape diferente da contrabarra, esse pode ser especificado usando a cláusula UESCAPE após a cadeia de caracteres. Por exemplo:

U&'d!0061t!+000061' UESCAPE '!'

O caractere de escape pode ser qualquer caractere que não seja um dígito hexadecimal, o sinal de mais, aspas, apóstrofos, ou um caractere de espaço em branco. Note que tudo é escrito entre apóstrofos (')

Para incluir o caractere de escape na cadeia de caracteres sem interpretação, esse deve ser escrito duas vezes.

Tanto a forma de escape de 4 dígitos, quanto a de 6 dígitos, podem ser usadas para especificar pares substitutos UTF-16, compondo assim caracteres com pontos de código maiores que U+FFFF, embora a disponibilidade da forma de 6 dígitos tecnicamente torne isso desnecessário. (Os pares substitutos não são armazenados diretamente, mas são combinados em um único ponto de código.)

Se a codificação do servidor não for UTF-8, o ponto de código Unicode identificado por uma dessas sequências de escape será convertido na codificação do servidor em atividade; um erro é relatado se isso não for possível.

Além disso, a sintaxe de escape Unicode para constantes cadeia de caracteres só funciona quando o parâmetro de configuração standard_conforming_strings está ativo (on). Isso acontece, porque, caso contrário, essa sintaxe pode confundir os clientes que analisam as instruções SQL a ponto de levar a injeções de SQL e problemas de segurança semelhantes. Se o parâmetro estiver desativado, essa sintaxe será rejeitada com uma mensagem de erro.

Exemplo: [25]

SELECT U&'d\0061t\+000061' AS "DATA U4+U4",
       U&'\0441\043B\043E\043D' AS "ELEFANTE",
       U&'d!0061t!+000061' UESCAPE '!' AS "DATA U4+U6";

 DATA U4+U4 | ELEFANTE | DATA U4+U6
------------+----------+------------
 data       | слон     | data
(1 linha)

4.1.2.4. Constantes do tipo cadeia de caracteres delimitadas por cifrão #

Embora a sintaxe padrão para definir constantes cadeia de caracteres seja geralmente conveniente, pode ser difícil ser entendida quando a cadeia de caracteres desejada contém muitos apóstrofos, porque cada um deles deve ser duplicado. Para permitir consultas mais legíveis nessas situações, o PostgreSQL fornece outra maneira, chamada delimitação por cifrão, para escrever constantes cadeia de caracteres. Uma constante do tipo cadeia de caracteres delimitada por cifrão consiste em um cifrão ($), uma etiqueta opcional de zero ou mais caracteres, outro cifrão, a sequência arbitrária de caracteres que compõe o conteúdo da cadeia de caracteres, um cifrão, a mesma etiqueta que começou essa delimitação, e um cifrão. Por exemplo, aqui estão duas maneiras diferentes para definir a cadeia de caracteres Maria D'Almeida usando delimitação por cifrão:

$$Maria D'Almeida$$
$Etiqueta$Maria D'Almeida$Etiqueta$

Note que dentro da cadeia de caracteres delimitada por cifrão, os apóstrofos podem ser usados sem a necessidade de escape. De fato, nenhum caractere dentro da cadeia de caracteres delimitada por cifrão precisa de escape: o conteúdo da cadeia de caracteres é sempre escrito literalmente. As contrabarras não são caracteres especiais, nem os cifrões, a menos que façam parte de uma sequência que corresponda à etiqueta de abertura.

É possível aninhar constantes cadeias de caractere delimitadas por cifrão usando etiquetas diferentes para cada nível de aninhamento. Isso é geralmente usado ao escrever definições de função. Por exemplo:

$function$
BEGIN
    RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$

Nesse exemplo, a sequência $q$[\t\r\n\v\\]$q$ representa a cadeia de caracteres delimitada por cifrão [\t\r\n\v\\], que será reconhecida quando o corpo da função for executado pelo PostgreSQL. Mas como a sequência não corresponde ao delimitador cifrão externo $function$, são apenas mais alguns caracteres dentro da constante no que diz respeito à cadeia de caracteres externa.

As etiquetas das cadeias de caracteres delimitadas por cifrão, caso existam, seguem as mesmas regras de um identificador não delimitado, exceto por não poderem conter o caractere cifrão. As etiquetas diferenciam letras maiúsculas de minúsculas, portanto $etiqueta$Conteúdo da cadeia de caracteres$etiqueta$ está correto, porém $ETIQUETA$Conteúdo da cadeia de caracteres$etiqueta$ não está.

Uma cadeia de caracteres delimitada por cifrão, que vem após uma palavra-chave ou identificador, deve estar separada deste por espaço em branco; caso contrário, o delimitador de cifrão seria considerado parte do identificador anterior.

A delimitação por cifrão não faz parte do padrão SQL, mas é geralmente uma maneira mais conveniente para escrever constantes cadeias de caractere complicadas, do que a sintaxe de apóstrofos compatível com o padrão. É particularmente útil ao representar constantes cadeias de caracteres dentro de outras constantes, como muitas vezes se faz necessário em definições de funções procedurais. Com a sintaxe de apóstrofos, cada contrabarra no exemplo acima teria que ser escrita com quatro contrabarras, que seriam reduzidas a duas contrabarras ao analisar a constante cadeia de caracteres original e, em seguida, a uma quando a constante do tipo cadeia de caracteres interna for analisada novamente durante a execução da função.

4.1.2.5. Constantes do tipo cadeia de bits #

As constantes do tipo cadeia de bits se parecem com uma constante cadeia de caracteres regular contendo um B (maiúsculo ou minúsculo) logo antes do apóstrofo de abertura (sem espaço intermediário), como, por exemplo, em B'1001'. Os únicos caracteres permitidos dentro da constante cadeia de bits são 0 e 1.

Como alternativa, as constantes cadeia de bits podem ser definidas na notação hexadecimal usando um X (maiúsculo ou minúsculo) inicial, como, por exemplo, em X'1FF'. Essa notação é equivalente a uma constante cadeia de bits com quatro dígitos binários para cada dígito hexadecimal.

Ambas as formas de constante cadeia de bits podem ser continuadas em outras linhas da mesma maneira que as constantes cadeia de caracteres regulares. A delimitação por cifrão não pode ser usada em uma constante cadeia de bits.

Exemplo: [26]

SELECT X'1FF' AS "12 BITS HEXA",
       B'000111111111' AS "12 BITS BIN",
       X'1FF'::integer - B'000111111111'::integer AS "DIFERENÇA";

 12 BITS HEXA | 12 BITS BIN  | DIFERENÇA
--------------+--------------+-----------
 000111111111 | 000111111111 |         0
(1 linha)

4.1.2.6. Constantes numéricas #

São aceitas constantes numéricas nas seguintes formas gerais:

dígitos
dígitos.[dígitos][e[+-]dígitos]
[dígitos].dígitos[e[+-]dígitos]
dígitose[+-]dígitos

onde dígitos são um ou mais dígitos decimais (0 a 9). Deve haver pelo menos um dígito antes ou depois do ponto decimal, se esse for usado. Deve haver pelo menos um dígito após a marca de expoente (e), caso esteja presente. Não podem existir espaços ou outros caracteres incorporados à constante, exceto os sublinhados, que podem ser usados ​​para agrupamento visual, conforme descrito abaixo. Note que os sinais menos e mais que antecedem a constante não são, na verdade, considerados parte da constante, e sim um operador aplicado à constante.

Abaixo são mostrados alguns exemplos de constantes numéricas válidas:

42
3.5
4.
.001
5e2
1.925e-3

Além disso, constantes inteiras não decimais são aceitas nos seguintes formatos:

0xdígitos_hexadecimais
0odígitos_octais
0bdígitos_binários

onde dígitos_hexadecimais é um ou mais dígito hexadecimal (0-9, A-F), dígitos_octais é um ou mais dígito octal (0-7), e dígitos_binários é um ou mais dígito binário (0 or 1). Os dígitos hexadecimais e os prefixos de base podem estar em letras maiúsculas ou minúsculas. Note que apenas os números inteiros podem incluir uma parte fracionária. [27] Isso não ocorre com os demais números.

Estes são alguns exemplos de constantes inteiras não decimais válidas:

0b100101
0B10011001
0o273
0O755
0x42f
0XFFFF

Para agrupamento visual, podem ser inseridos sublinhados entre os dígitos. Estes sublinhados não têm nenhum efeito adicional sobre o valor da constante. Por exemplo:

1_500_000_000
0b10001000_00000000
0o_1_755
0xFFFF_FFFF
1.618_034

Não são permitidos sublinhados no início ou no final de uma constante numérica ou de um grupo de dígitos (isto é, imediatamente antes ou depois do ponto decimal ou do marcador de expoente), e não é permitido mais de um sublinhado em sequência (juntos).

Uma constante numérica não contendo o ponto decimal nem o expoente é presumida, inicialmente, como sendo do tipo integer, se o seu valor for apropriado para o tipo integer (32 bits); senão é presumida como sendo do tipo bigint, se o seu valor for apropriado para o tipo bigint (64 bits); caso contrário, é assumida como sendo do tipo numeric. As constantes que contêm ponto decimal e/ou expoentes são sempre presumidas inicialmente como sendo do tipo numeric.

O tipo de dados atribuído inicialmente para a constante numérica é apenas o ponto de partida para os algoritmos de resolução de tipo. Geralmente, a constante é automaticamente convertida no tipo mais apropriado conforme o contexto. Quando for necessário, pode-se impor que o valor numérico seja interpretado como sendo de um tipo de dados específico, fazendo a sua conversão. Por exemplo, pode-se impor que o valor numérico seja tratado como sendo do tipo real (float4) escrevendo:

REAL '1.23'  -- estilo cadeia de caracteres
1.23::REAL   -- estilo PostgreSQL (histórico)

Na verdade, estes são apenas casos especiais das notações gerais de conversão mostradas a seguir.

4.1.2.7. Constantes de outros tipos #

Pode ser declarada uma constante de um tipo arbitrário utilizando uma das seguintes notações:

tipo 'cadeia de caracteres'
'cadeia de caracteres'::tipo
CAST ( 'cadeia de caracteres' AS tipo )

O texto da constante do tipo cadeia de caracteres é passado para a rotina de conversão para o tipo chamado tipo. O resultado é uma constante do tipo indicado. A conversão explícita de tipo pode ser omitida caso não haja ambiguidade com relação ao tipo que a constante deva ter (por exemplo, quando é atribuída diretamente para a coluna de uma tabela), nesse caso é convertida automaticamente.

A constante do tipo cadeia de caracteres pode ser escrita utilizando tanto a notação regular do padrão SQL, quanto a delimitação por cifrão.

Também é possível definir a conversão de tipo utilizando uma sintaxe semelhante a de chamada de função:

nome_do_tipo ( 'cadeia de caracteres' )

mas nem todos os nomes de tipo podem ser usados desta forma. Veja a Seção 4.2.9 para obter mais detalhes.

As sintaxes ::, CAST() e chamada de função, também podem ser usadas para definir conversões de tipo de expressões arbitrárias em tempo de execução, conforme discutido na Seção 4.2.9. Para evitar ambiguidade sintática, a sintaxe do tipo 'cadeia de caracteres' só pode ser usada para definir o tipo de uma constante literal simples. Outra restrição na sintaxe do tipo 'cadeia de caracteres' é não funcionar para tipos matriz (array); deve ser usado :: ou CAST() para definir o tipo de uma constante em forma de matriz.

A sintaxe CAST() está em conformidade com o padrão SQL. A sintaxe tipo 'cadeia de caracteres' é uma generalização do padrão SQL, que define essa sintaxe somente para alguns tipos de dados, mas o PostgreSQL permite seu uso para todos os tipos. A sintaxe :: é um uso histórico no PostgreSQL, assim como a sintaxe de chamada de função.

4.1.3. Operadores #

Um nome de operador é uma sequência com até NAMEDATALEN-1 (63, por padrão) caracteres da seguinte lista:

+ - * / < > = ~ ! @ # % ^ & | ` ?

Entretanto, existem algumas poucas restrições para os nomes de operadores:

  • -- e /* não podem aparecer em nenhum lugar no nome do operador, porque são considerados início de comentário.

  • Um nome de operador com múltiplos caracteres não pode terminar por + ou -, a não ser que o nome também contenha ao menos um dos seguintes caracteres:

    ~ ! @ # % ^ & | ` ?
    

    Por exemplo, @- é um nome de operador permitido, mas *- não é. Esta restrição permite ao PostgreSQL analisar comandos compatíveis com o padrão SQL sem requerer espaços entre os tokens.

Ao trabalhar com nomes de operadores que não fazem parte do padrão SQL, normalmente é necessário separar os operadores adjacentes por espaço, para evitar ambiguidade. Por exemplo, se for definido um operador unário-esquerdo (prefixo) chamado @, não poderá ser escrito X*@Y; deverá ser escrito X* @Y, para garantir que o PostgreSQL leia dois nomes de operador, e não apenas um.

4.1.4. Caracteres especiais #

Alguns caracteres não alfanuméricos têm um significado especial diferente do significado de um operador. Os detalhes da utilização podem ser encontrados nos locais onde o respectivo elemento de sintaxe está descrito. Essa seção se destina apenas a informar a existência e fazer um resumo das finalidades desses caracteres.

  • O caractere cifrão ($) seguido por dígitos é usado para representar parâmetros posicionais no corpo da definição de uma função ou de uma instrução preparada. Em outros contextos, o caractere cifrão pode ser parte do identificador, ou de uma constante do tipo cadeia de caracteres delimitada por cifrão.

  • Os parênteses (()) possuem seu significado habitual de agrupar expressões e impor precedência. Em alguns casos, os parênteses são requeridos como parte da sintaxe estabelecida para um determinado comando SQL.

  • Os colchetes ([]) são usados para selecionar elementos da matriz. Veja a Seção 8.15 para obter mais informações sobre matrizes.

  • As vírgulas (,) são usadas em algumas construções sintáticas para separar os elementos da lista.

  • O ponto-e-vírgula (;) termina o comando SQL, não podendo aparecer em nenhum lugar dentro do comando, exceto dentro de uma constante cadeia de caracteres, ou de um identificador entre aspas.

  • Os dois-pontos (:) são usados para selecionar fatias de matrizes (veja a Seção 8.15). Em certos dialetos do SQL, como o SQL Embarcado (Embedded SQL), os dois-pontos são usados como prefixo dos nomes das variáveis.

  • O asterisco (*) é usado em alguns contextos para indicar todos os campos na linha de uma tabela, ou de um valor composto. Também possui significado especial quando usado como argumento de uma função de agregação, significando que a agregação não requer um parâmetro explícito.

  • O ponto (.) é usado nas constantes numéricas, e para separar os nomes de esquemas, tabelas e colunas.

4.1.5. Comentários #

Um comentário é uma sequência arbitrária de caracteres começando por dois hifens e se estendendo até o final da linha, como, por exemplo:

-- Este é um comentário em conformidade com o padrão SQL-92

Como alternativa, podem ser usados blocos de comentários no estilo C:

/* comentário de várias linhas
 * com aninhamento: /* bloco de comentário aninhado */
 */

onde o comentário começa por /* e se estende até encontrar a ocorrência correspondente de */. Esses blocos de comentários podem estar aninhados, conforme definido no padrão SQL, mas não como na linguagem C, permitindo transformar em comentário grandes blocos de código contendo blocos de comentários.

Os comentários são removidos do fluxo de entrada antes de prosseguir com a análise sintática, sendo substituídos por um espaço em branco.

4.1.6. Precedência dos operadores #

A Tabela 4.2 mostra a precedência e a associatividade dos operadores no PostgreSQL. A maioria dos operadores possui a mesma precedência e são associativos à esquerda. A precedência e a associatividade dos operadores estão codificadas no analisador. Adicione parênteses se desejar que uma expressão com vários operadores seja analisada de alguma outra maneira, que não seja a que as regras de precedência implicam.

Tabela 4.2. Precedência dos operadores (da mais alta para a mais baixa)

Operador/ElementoAssociatividadeDescrição
.esquerdaseparador de nome de tabela e coluna
::esquerdaconversão de tipo no estilo PostgreSQL
[ ]esquerdaseleção de elemento da matriz
+ -direitamais unário, menos unário
COLLATEesquerdaseleção de colação
ATesquerdaAT TIME ZONE, AT LOCAL
^esquerdaexponenciação
* / %esquerdamultiplicação, divisão, módulo
+ -esquerdaadição, subtração
(qualquer outro operador)esquerdaqualquer outro operador nativo ou definido pelo usuário
BETWEEN IN LIKE ILIKE SIMILAR contido no intervalo, membro do conjunto, correspondência de padrão em cadeia de caracteres
< > = <= >= <> operadores de comparação
IS ISNULL NOTNULL IS TRUE, IS FALSE, IS NULL, IS DISTINCT FROM, etc.
NOTdireitanegação lógica
ANDesquerdaconjunção lógica
OResquerdadisjunção lógica

Note que as regras de precedência do operador também se aplicam aos operadores definidos pelos usuários que possuem os mesmos nomes dos operadores internos mencionados acima. Por exemplo, se for definido pelo usuário um operador + para algum tipo de dado personalizado, esse terá a mesma precedência do operador + interno, não importando o que faça.

Quando é usado um nome de operador qualificado pelo esquema na sintaxe OPERATOR como, por exemplo, em

SELECT 3 OPERATOR(pg_catalog.+) 4;

a construção OPERATOR é assumida como tendo a precedência padrão mostrada na Tabela 4.2 para qualquer outro operador. Isso é sempre verdade, não importando qual o nome do operador definido dentro de OPERATOR().

Nota

As versões do PostgreSQL anteriores a 9.5 usavam regras de precedência de operador ligeiramente diferentes. Em particular, <= >= e <> costumavam ser tratados como operadores genéricos; os testes de IS costumavam ter prioridade mais alta; e NOT BETWEEN e construções relacionadas agiam de forma inconsistente, sendo tomadas, em alguns casos, como tendo a precedência do NOT, em vez da precedência do BETWEEN. Essas regras foram alteradas para melhorar a conformidade com o padrão SQL e para reduzir a confusão do tratamento inconsistente de construções logicamente equivalentes. Geralmente, essas mudanças não vão resultar em nenhuma mudança de comportamento, ou talvez em falhas de operador desconhecido que podem ser resolvidas adicionando parênteses. No entanto, há casos especiais em que uma consulta pode mudar seu comportamento sem que nenhum erro de análise seja relatado.



[14] Token: Uma unidade básica e gramaticalmente indivisível de uma linguagem, como uma palavra-chave, operador ou identificador. FOLDOC - Free On-Line Dictionary Of Computing (N. T.)

[15] Nesse texto aspas duplas são chamadas apenas de aspas ("), e aspas simples são chamadas de apóstrofos( '). (N. T.)

[16] Uma constante (às vezes chamada de literal) especifica um valor. Constantes são classificadas como constantes de cadeias de caracteres ou constantes numéricas. As constantes numéricas são ainda classificadas como inteiras, de ponto flutuante ou decimais. IBM DB2 Constants (N. T.)

[17] O nome do objeto de banco de dados é conhecido como identificador. Tudo no Microsoft SQL Server pode ter um identificador. Servidores, bancos de dados e objetos de banco de dados, como tabelas, visões, colunas, índices, gatilhos, procedimentos, restrições e regras, podem ter identificadores. Os identificadores são necessários para a maioria dos objetos, mas são opcionais para alguns objetos, como restrições. Identificadores de banco de dados (N. T.)

[18] Diacrítico: Diz-se de ou sinal gráfico que serve para diferenciar letras ou palavras (ex.: sinal diacrítico; os acentos, o til e a cedilha são diacríticos). diacrítico, in Dicionário Priberam da Língua Portuguesa [em linha], 2008-2021, [consultado em 03-07-2022]. (N. T.)

[19] Diacrítico: (1) Uma marca aplicada ou anexada a um símbolo para criar um novo símbolo representando o valor modificado ou novo. (2) Uma marca aplicada a um símbolo independentemente de alterar o valor desse símbolo. No último caso, o diacrítico geralmente representa um valor independente (por exemplo, um acento, tom ou alguma outra informação linguística). Também chamado de marca diacrítica ou diacrítico. Glossary of Unicode Terms. (N. T.)

[20] Ponto de código: (1) Qualquer valor no codespace Unicode; ou seja, no intervalo de inteiros de 0 a 10FFFF₁₆. Nem todos os pontos de código são atribuídos a caracteres codificados. Veja tipo de ponto de código. (2) Um valor, ou posição, para um caractere, em qualquer conjunto de caracteres codificados. Code Point (N. T.)

[21] Par substituto (Surrogate pair): Uma representação para um único caractere abstrato que consiste em uma sequência de duas unidades de código de 16 bits, onde o primeiro valor do par é uma unidade de código substituto alto e o segundo valor é uma unidade de código substituto baixo. Surrogates (N. T.)

[22] Veja também: Sequências de escape. (N. T.)

[23] Exemplo escrito pelo tradutor, não fazendo parte da documentação original.

[24] Exemplo escrito pelo tradutor, não fazendo parte da documentação original.

[25] Exemplo escrito pelo tradutor, não fazendo parte da documentação original.

[26] Exemplo escrito pelo tradutor, não fazendo parte da documentação original.