Обсуждение: to_char not IMMUTABLE?
I had a problem when upgrading a database from 8.1.4 to 8.2.1: Sorry, the error messages are in german. pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 1531; 1259 3477393 INDEX idx_inspektionen_dat_inspektion pg_restore: [archiver (db)] could not execute query: FEHLER: Funktionen im Indexausdruck muessen als IMMUTABLE markiertsein Command was: CREATE INDEX idx_inspektionen_dat_inspektion ON inspektionen USING btree (to_char(dat_inspektion,'yyyy'::text)); WARNING: errors ignored on restore: 1 to_char(timestamp, 'yyyy') should be constant and marked immutable, or am I wrong here? Or is it not marked immutable becauseof possible changes on date_format? Regards,Mario Weilguni
On Fri, Jan 12, 2007 at 11:55:07AM +0100, Mario Weilguni wrote: > to_char(timestamp, 'yyyy') should be constant and marked immutable, > or am I wrong here? Or is it not marked immutable because of possible > changes on date_format? AIUI, to_char is not immutable because it can be effected by external variables, like LC_TIME. As it is though, I'm not sure why you're using to_char here, surely extract or date_truc would be more appropriate? Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > From each according to his ability. To each according to his ability to litigate.
Am Freitag, 12. Januar 2007 14:48 schrieb Martijn van Oosterhout: > On Fri, Jan 12, 2007 at 11:55:07AM +0100, Mario Weilguni wrote: > > to_char(timestamp, 'yyyy') should be constant and marked immutable, > > or am I wrong here? Or is it not marked immutable because of possible > > changes on date_format? > > AIUI, to_char is not immutable because it can be effected by external > variables, like LC_TIME. > > As it is though, I'm not sure why you're using to_char here, surely > extract or date_truc would be more appropriate? Thanks for the info. Changing this to use extract is no real problem, I was just curious if this is intendend behaviour. Best regards, Mario Weilguni
Mario Weilguni <mweilguni@sime.com> writes: > Thanks for the info. Changing this to use extract is no real problem, I was > just curious if this is intendend behaviour. From the CVS logs: 2006-11-28 14:18 tgl * src/include/catalog/: pg_proc.h (REL7_3_STABLE), pg_proc.h(REL7_4_STABLE), pg_proc.h (REL8_1_STABLE), pg_proc.h(REL8_0_STABLE):Mark to_number() and the numeric-type variants ofto_char() as stable, not immutable, because theirresults depend onlc_numeric; this is a longstanding oversight. We cannot forceinitdb for this in the back branches,but we can at least providecorrect catalog entries for future installations. 2006-11-28 14:18 tgl * src/include/catalog/pg_proc.h: Mark to_char(timestamp withouttimezone) as stable, not immutable, since its result now dependsonthe lc_messages setting, as noted by Bruce. Also, mark to_number()and the numeric-type variants of to_char() asstable, because theirresults depend on lc_numeric; this is a longstanding oversight. Also, mark to_date() and to_char(interval)as stable; althoughthese appear not to depend on any GUC variables as of CVS HEAD,that seems a propertyunlikely to survive future improvements. Itseems best to mark all the formatting functions stable and be donewithit. catversion not bumped, because this does not seemcritical enough to force a post-RC1 initdb, and anyway we cannotdoso in the back branches. regards, tom lane
Mario Weilguni wrote: > > I had a problem when upgrading a database from 8.1.4 to 8.2.1: > Sorry, the error messages are in german. > > pg_restore: [archiver (db)] Error while PROCESSING TOC: > pg_restore: [archiver (db)] Error from TOC entry 1531; 1259 > 3477393 INDEX idx_inspektionen_dat_inspektion > pg_restore: [archiver (db)] could not execute query: FEHLER: > Funktionen im Indexausdruck muessen als IMMUTABLE markiert sein > Command was: CREATE INDEX idx_inspektionen_dat_inspektion > ON inspektionen USING btree (to_char(dat_inspektion, 'yyyy'::text)); > WARNING: errors ignored on restore: 1 > > to_char(timestamp, 'yyyy') should be constant and marked > immutable, or am I wrong here? Or is it not marked immutable > because of possible changes on date_format? At some point, the configuration parameter lc_time should have an influence on the output of to_char(timestamp, text), although this behaviour is not yet implemented. I guess that is why the function is STABLE ind not IMMUTABLE. Maybe you can use date_part('YEAR', dat_inspektion)::bpchar Yours, Laurenz Albe