Discussion:
cast not IMMUTABLE?
(too old to reply)
Gaetano Mendola
2004-05-06 23:37:29 UTC
Permalink
Hi all,
I have a table with ~ 3e+6 rows on it.

I do select on this table in this way:


(1) select * from user_logs where login_time::date = now()::date;


consider that login_time is a TIMESTAMPTZ with an index on it.

If I use the select in this way:

select * from user_logs where login_time = now();

the the index is used.

I'm trying to use define and index in order to help the query (1):


test# create index idx on user_logs ( (login_time::date) );
ERROR: functions in index expression must be marked IMMUTABLE


why that cast is not considered IMMUTABLE ?


How can I define an index for the query (1) ?


Regards
Gaetano Mendola
Sam Barnett-Cormack
2004-05-07 00:33:58 UTC
Permalink
Post by Gaetano Mendola
Hi all,
I have a table with ~ 3e+6 rows on it.
(1) select * from user_logs where login_time::date = now()::date;
consider that login_time is a TIMESTAMPTZ with an index on it.
select * from user_logs where login_time = now();
the the index is used.
test# create index idx on user_logs ( (login_time::date) );
ERROR: functions in index expression must be marked IMMUTABLE
why that cast is not considered IMMUTABLE ?
How can I define an index for the query (1) ?
The way I have done such queries hs been to create functions, marked
immutable, that encapsulate the cast/non-immutable internal function, if
I know that it *is* really immutable, at least for my purposes, and use
a functional index.
--
Sam Barnett-Cormack
Software Developer | Student of Physics & Maths
UK Mirror Service (http://www.mirror.ac.uk) | Lancaster University

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org
Stephan Szabo
2004-05-08 23:33:51 UTC
Permalink
Post by Gaetano Mendola
Hi all,
I have a table with ~ 3e+6 rows on it.
(1) select * from user_logs where login_time::date = now()::date;
consider that login_time is a TIMESTAMPTZ with an index on it.
select * from user_logs where login_time = now();
the the index is used.
test# create index idx on user_logs ( (login_time::date) );
ERROR: functions in index expression must be marked IMMUTABLE
why that cast is not considered IMMUTABLE ?
I'd think the conversion of a timestamptz -> date would be dependent on
timezone which would make it not immutable.


---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faqs/FAQ.html

Loading...