Pertama saya pikir ini mungkin bug di CREATE INDEX
logika. Tapi intinya castnya dari text
ke timestamptz
itu sendiri bukan IMMUTABLE
antara. Itu tergantung pada pengaturan yang mudah menguap seperti datestyle
.
Dalam kasus khusus Anda, ada solusi yang bahkan lebih baik daripada yang Anda coba. Pindahkan pemeran ke dalam fungsi:
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;
Sama efisiennya, tetapi sekarang CREATE INDEX
tidak akan muntah:
CREATE INDEX bar ON foo(to_text(j->>'start_time'));
Jelas, Anda harus menyesuaikan panggilan fungsi Anda dengan tepat:jatuhkan ::timestamptz
dari ekspresi. Pastikan Anda menggunakan setelan yang sama di mana saja , atau indeks dapat menyebabkan hasil yang salah.
Lebih baik lagi
Gunakan ekspresi yang benar-benar tidak dapat diubah dengan to_timestamp()
alih-alih pemeran (jika pola input Anda mengizinkannya):
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;
Namun perhatikan (mengutip pesan kesalahan dari pengujian saya):
Pola format "TZ"/"tz"/"OF" tidak didukung hingga_date