J'ai d'abord pensé que cela pourrait être un bogue dans le CREATE INDEX
logique. Mais le fait est que le casting de text
à timestamptz
lui-même n'est pas IMMUTABLE
Soit. Cela dépend de paramètres volatils comme datestyle
.
Dans votre cas particulier, il existe une solution de contournement encore meilleure que celle que vous avez essayée. Déplacez le cast dans la fonction :
CREATE OR REPLACE FUNCTION to_text(text)
RETURNS text AS
$func$
SELECT to_char($1::timestamptz AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$func$ LANGUAGE sql IMMUTABLE;
Tout aussi efficace, mais maintenant CREATE INDEX
ne vomira pas :
CREATE INDEX bar ON foo(to_text(j->>'start_time'));
Évidemment, vous devez ajuster vos appels de fonction en conséquence :supprimez le cast ::timestamptz
de l'expression. Assurez-vous d'utiliser les mêmes paramètres partout , ou l'index peut conduire à de faux résultats.
Mieux encore
Utilisez une expression réellement immuable avec to_timestamp()
au lieu de la distribution (si votre modèle d'entrée le permet) :
CREATE OR REPLACE FUNCTION to_text(text)
RETURNS text AS
$func$
SELECT to_char(to_timestamp($1, 'YYYY-MM-DD"T"HH24:MI:SS.US') -- adapt to your pattern
AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US')
$func$ LANGUAGE sql IMMUTABLE;
Notez cependant (citant un message d'erreur de mon test) :
Les modèles de format "TZ"/"tz"/"OF" ne sont pas pris en charge dans to_date