まず、これはCREATE INDEXのバグかもしれないと思いました 論理。ただし、重要なのは、textからのキャストです。 timestamptzへ それ自体はIMMUTABLEではありません また。 datestyleのような揮発性の設定に依存します 。
あなたの特定のケースでは、あなたが試したものよりもさらに良い回避策があります。キャストを関数に移動します:
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;
同じように効率的ですが、CREATE INDEX 吠えない:
CREATE INDEX bar ON foo(to_text(j->>'start_time'));
明らかに、それに応じて関数呼び出しを調整する必要があります。キャスト::timestamptzを削除します。 式から。 どこでも同じ設定を使用するようにしてください 、またはインデックスが誤った結果につながる可能性があります。
さらに良い
to_timestamp()で実際に不変の式を使用する キャストの代わりに(入力パターンで許可されている場合):
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; ただし、注意してください(私のテストからのエラーメッセージを引用):
"TZ" / "tz"/"OF"形式のパターンはto_dateではサポートされていません