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
