PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ERREUR :les fonctions dans l'expression d'index doivent être marquées IMMUTABLE dans Postgres

D'après ce fil de la liste de diffusion des hackers :

http://www.mail-archive.com/[email protected]/msg86725.html

ceci est un comportement prévu comme to_char dépend du paramètre LC_MESSAGES

Dans votre cas, cela n'a apparemment aucun sens car le format que vous utilisez ne dépendra jamais des paramètres régionaux, donc si vous avez besoin d'utiliser la représentation textuelle dans l'index, vous pouvez créer votre propre fonction to_char() et la marquer comme immuable :

CREATE OR REPLACE FUNCTION my_to_char(some_time timestamp) 
  RETURNS text
AS
$BODY$
    select to_char($1, 'yyyy-mm-dd');
$BODY$
LANGUAGE sql
IMMUTABLE;

Si vous devez l'utiliser comme texte dans l'index (et que vous ne pouvez pas utiliser le cast à une date comme Sam l'a suggéré), vous devrez créer votre propre fonction de formatage que vous pourrez marquer comme immuable. Cela peut ensuite être utilisé dans l'index.

Mais pour que Postgres utilise l'index dont vous aurez besoin pour appeler my_to_char() également dans vos instructions SQL. Il ne le reconnaîtra pas lorsque vous utiliserez le to_char() intégré

Mais je pense que la suggestion de Sam d'utiliser une date simple dans l'index est probablement meilleure