functions in index predicate must be marked IMMUTABLE

Sziasztok!

A tárgyban említett postgresql hibát kaptam, és nem értem miért, légyszi segítsetek megérteni a dolgot.

íme a hiba:
SQL state: 42P17
Context: SQL statement "CREATE INDEX idx_search_aggregate_date_apr_1206 ON infx.search_aggregate_1206 USING btree ("start_date")
WHERE ((start_date >= (to_char(2012, '9999') || '-04-01')::date) AND (start_date <= (to_char(2012, '9999') || '-04-30')::date))"

Ami még érdekes, hogy eddig be volt égetve az év, és úgy tökéletesen működik:
CREATE INDEX idx_search_aggregate_date_apr_1206 ON infx.search_aggregate_1206 USING btree ("start_date")
WHERE ((start_date >= '2012-04-01'::date) AND (start_date <= '2012-04-30'::date))

egyébként ez egy tárolt eljárásban van. A megoldás az lett, hogy az évet nem az indexben alakítom át:
start_date >= (to_char(' || year_in_index || ', ''9999'') || ''-04-01'')::date
hanem még előtte:
select into year_in_index to_char(next_year, '9999');
start_date >= ''' || year_in_index || '-04-01''::date

Ettől függetlenül nemnagyon értem miben más ez a megoldás.

Köszi az építő válaszokat.

Hozzászólások

Nyilván onnan indul, hogy a to_char nem immutable, és talán azért, mert ha változik az időzóna, más eredményt ad vissza. Egyébként nézd meg a forráskódját.

--
joco voltam szevasz

Ha lesz időm meglesem a forráskódját is (valószínő én vagyok a low), de jelen esetben, (to_char(2012, '9999') || '-04-01')::date, egy string összefűzésről van szó és egy castolásról, aminek vajmi kevés közének kéne lennie az időzónához. Nekem az volna a logikus, hogy ez to_char(2012, '9999') || '-04-01' összefűzi a 2 stringet, majd a '2010-04-01'::date tipusra alakítja. Értem, hogy nem immutable, de én a date-re alakítást nem a to_char-on végzem, hanem a stringen, ami az összefűzés eredménye.

java'nother blog