Em 27 de janeiro de 2016 20:37, Eduardo Az - EMBRASIS
<[email protected]> escreveu:

[... corte ...]

> CREATE OR REPLACE FUNCTION public.__sem_acentos(character varying)
>   RETURNS character varying AS
> $BODY$
> SELECT TRANSLATE($1, 'áéíóúàèìòùãõâêîôûäëïöüçÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ&',
>                     'aeiouaeiouaoaeiouaeioucAEIOUAEIOUAOAEIOUAEIOUCe')
> $BODY$
>   LANGUAGE sql VOLATILE

[... corte ...]

> CREATE INDEX cadastro_nome_idx
>   ON public.cadastro
>   USING btree
>   ( unaccent(nome) COLLATE pg_catalog."default");
>
> MENSAGEM DE ERRO:
> ERROR:  functions in index expression must be marked IMMUTABLE
> ********** Error **********
>
> ERROR: functions in index expression must be marked IMMUTABLE
> SQL state: 42P17
>
> Que erro é esse? E porque?

Vou respoder uma parte.

Se eu tenho uma função marcada como volátil, eu estou informando ao
plano que para um mesmo valor de entrada a função pode retornar valores
diferentes.

Veja este exemplo:

guedes=> \x
Exibição expandida está habilitada.
guedes=> select clock_timestamp(), 'PEDRO DE LARARA LARARARA',
clock_timestamp();
-[ RECORD 1 ]---+------------------------------
clock_timestamp | 2016-01-27 21:08:30.152096-02
?column?        | PEDRO DE LARARA LARARARA
clock_timestamp | 2016-01-27 21:08:30.152098-02

Veja que os microsegundos mudam, _de um campo para o outro_ no *mesmo
registro* chamando a *mesma função*.

Adivinha o porquê? Pois sim...

guedes=> \df+ clock_timestamp
Lista de funções
-[ RECORD 1 ]--------------+-------------------------
Esquema                    | pg_catalog
Nome                       | clock_timestamp
Tipo de dado do resultado  | timestamp with time zone
Tipos de dado do argumento |
Tipo                       | normal
Segurança                  | invocador
Volatilidade               | volátil        <=========== aqui...
Dono                       | postgres
Linguagem                  | internal
Código fonte               | clock_timestamp
Descrição                  | current clock time

Pense quão louco o índice ficaria com uma função dessas? O indice
parcial utilizando uma função precisa ser preciso quanto ao resultado,
porque ele vai escolher uma posição fisica para armazenar então se
hora você chama a funcao xpto(1) e ela retorna 2 e depois voce chama
denovo xpto(1) e ela retorna 3 como ele vai saber onde procurar no
índice?

Uma funçao imutável é a int4pl que eh chamado pelo operador "+", em
outras palavras, quando você faz 2+2 o banco faz internamente:
int4pl(2,2) que retorna 4, sempre (não vamos falar aqui em computação
quântica).

Então é isto a função precisa ser marcada como imutável, desde que ela
tenha um comportamento imutável, claro.

> Simplesmente mudei o nome da função, a sintaxe é a mesma.

Foi exatamente isto que você fez? Já tinha o índice antes? Qual versão
do Postgres?

-- 
Dickson S. Guedes
mail/xmpp: [email protected] - skype: guediz
http://github.com/guedes - http://guedesoft.net
http://www.postgresql.org.br
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a