<< Click to Display Table of Contents >> Incompatibilidades |
![]() ![]() ![]() |
Caracter de escape é um termo usado em computação para identificar um único caracter numa cadeia de caracteres que altera o significado de seu sucessor. Uma sequência de escape é o subconjunto de caracteres da cadeia de caracteres formado pelo caracter de escape e o caracter com o significado alterado. Em geral, este caractere é a barra contrária (\).
Na versão 8.3 o seguinte comando é executado e a sequência "\n" é alterada por uma quebra de linha (Enter).
select 'Linha 1\nLinha 2'
Porém já dava o HINT e WARNING informando que isto poderia dar problema.
AVISO: uso de escape fora do padrão em cadeia de caracteres at character 8
HINT: Utilize a sintaxe de escape de cadeia de caracteres para escapes, i.e., E'\r\n'.
Para o caracter de escape ser identificado na cadeia de caracters no Postgres 9.0 é necessário informacar o caracter "E" antes da string.
select E'Linha 1\nLinha 2'
Obs.: Isto tambem resolve o problema de HINT e WARNING no postgres 8.3.
Caracter de escape uteis:
\' = Retorna a aspa simples. O resultado dos dois comandos são o mesmo: select E'aaa\'bbb\'ccc' e select E'aaa''bbb''ccc'
\xNº: Trocar o Nº pelo código ASCII referente ao caracter desejado. Ex.: select E'aaa\x22bbb\x22ccc'. O resultado será texto: aaa"bbb"ccc
\n: Quebra de linha (Enter)
Agora existe uma validação nos comentários de triggers/funções. Ao iniciar o bloco de comentários não é possivel recomeçar outro bloco sem terminar o problema (Isto seria algo totalmente desnecessário mas o Josuéééééé está enter nós).
Se o seguinte trecho estive dentro de uma função, será exibido o seguinte erro ao tentar compilar:
ERRO: comentário /* não foi terminado em ou próximo a "/*
/*
------------------------------------------------------------------------------
--Caso for uma C A R C A Ç A seta o custo entre os rendimentos
/* <= Por causa deste inicio de comentário (Adivinha de quem era esse script?)
if saldo.fn_get_is_produto_carcaca(l_nr_produto)='S' then
select movimento.fn_set_custo_rendimento_carcaca(new.cd_loja, new.cd_produto , new.qt_unitario, l_vl_custo, l_is_grava_lojas , coalesce(new.cd_usuario_alteracao, new.cd_usuario_gravacao) , l_is_grava_custo_sem_perda) into l_result;
end if;
*/
No Postgre 9.0 é possível alterar o valor de um parâmetro de entrada na função, o código abaixo funciona no 9.0 e deve-se tomar cuidado pra não utilizar esta sintax.
CREATE OR REPLACE FUNCTION "public"."fn_teste" (
"i_valor" integer
)
RETURNS integer AS
$body$
begin
i_valor = 10; <= Esta atribuição resulta em erro na versão 8.3,
por estar tentando modificar um valor de parâmetro de entrada.
return i_valor;
end
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
Este comando resulta no seguinte erro na versão 8.3 do Postgre.
ERROR: "$1" is declared CONSTANT
CONTEXT: compile of PL/pgSQL function "fn_teste" near line 2