Thread: Re: [HACKERS] adate::Date is equiv. to adate if adate is type of Date ?

Re: [HACKERS] adate::Date is equiv. to adate if adate is type of Date ?

From
Thomas Lockhart
Date:
> > >  btw, how I can find 'something' older than a month
> >   select * from titles
> >    where adate::date < 'today'::Date - '1 month'::timespan;
> this problem doesn't works:
>  apod=> select * from titles
>  apod-> where adate::date < 'today'::Date - '1 month'::timespan;
> ERROR:  There is more than one possible operator '<'
>         for types 'date' and 'datetime'
> but if I specify Datetime instead of Date it works, but still doesn't
> use index.
>  apod=> explain select * from titles
>  apod-> where adate::datetime < 'today'::Datetime
>  apod->  - '1 month'::timespan;
> NOTICE:  QUERY PLAN:
> Seq Scan on titles  (cost=64.10 size=466 width=28)

OK, try
select * from titles where adate < date('today'::Datetime - '1 month'::timespan);

although there may (still) be problems with Postgres recognizing that
it could use an index when the "constant" is an expression.

Let us know what you find out...
                      - Tom

-- 
Thomas Lockhart                lockhart@alumni.caltech.edu
South Pasadena, California


Thomas Lockhart <lockhart@alumni.caltech.edu> writes:
> OK, try
>
>  select * from titles
>   where adate < date('today'::Datetime - '1 month'::timespan);
>
> although there may (still) be problems with Postgres recognizing that
> it could use an index when the "constant" is an expression.

I'm afraid I can already predict the answer: the optimizer only knows
how to use an index to constrain the scan when it finds a WHERE clause
like "var op constant" or "constant op var".  What you've got there
isn't a constant.

The right solution, of course, is to put in a rewrite phase that does
constant-expression folding (probably after any rule-generated changes).
We've talked about that before, but it ain't gonna happen for 6.5.

BTW, the original question was why "where adate::date < 'today'::date"
wouldn't work.  What the optimizer sees in that case iswhere function(var) < constant
so it doesn't know how to use an index for that either.  Now, if you
had a functional index matching the function, it would know what to do.
But it'd be pretty silly to keep a separate functional index just to let
this work, seeing as how adate is already a date.

It might be nice if the parser could drop dummy type conversions
instead of leaving them as functions in the parse tree... although
doing that as part of a general constant-expression folder is probably
a better answer.
        regards, tom lane


Re: [HACKERS] adate::Date is equiv. to adate if adate is type of Date ?

From
Oleg Bartunov
Date:
On Tue, 4 May 1999, Thomas Lockhart wrote:

> Date: Tue, 04 May 1999 13:12:07 +0000
> From: Thomas Lockhart <lockhart@alumni.caltech.edu>
> To: Oleg Bartunov <oleg@sai.msu.su>
> Cc: Postgres Hackers List <hackers@postgreSQL.org>
> Subject: Re: [HACKERS] adate::Date is equiv. to adate if adate is type of Date ?
> 
> > > >  btw, how I can find 'something' older than a month
> > >   select * from titles
> > >    where adate::date < 'today'::Date - '1 month'::timespan;
> > this problem doesn't works:
> >  apod=> select * from titles
> >  apod-> where adate::date < 'today'::Date - '1 month'::timespan;
> > ERROR:  There is more than one possible operator '<'
> >         for types 'date' and 'datetime'
> > but if I specify Datetime instead of Date it works, but still doesn't
> > use index.
> >  apod=> explain select * from titles
> >  apod-> where adate::datetime < 'today'::Datetime
> >  apod->  - '1 month'::timespan;
> > NOTICE:  QUERY PLAN:
> > Seq Scan on titles  (cost=64.10 size=466 width=28)
> 
> OK, try
> 
>  select * from titles
>   where adate < date('today'::Datetime - '1 month'::timespan);
> 
> although there may (still) be problems with Postgres recognizing that
> it could use an index when the "constant" is an expression.
> 
> Let us know what you find out...

No, it's  doing Seq Scan. I checked with 6.4.2 and current 6.5 cvs
Oleg

> 
>                        - Tom
> 
> -- 
> Thomas Lockhart                lockhart@alumni.caltech.edu
> South Pasadena, California
> 

_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83