Thread: range query with timestamp returns different result with index than without (7.3.3)
range query with timestamp returns different result with index than without (7.3.3)
From
Christian van der Leeden
Date:
Hi, I'm have the following query: select count(*) from delivery where "creation_date" <= TIMESTAMP '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP '2003-03-01 00:00:00'; without any index the range query returns the correct result namely 272394, when i create an index on creation_date, I get 10371 as a result. I'm using 7.3.3 on Linux (gentoo). Any help appreciated, if you need more information I'm happy to provide it. Here is a transcript: gaiaperformance=> select count(*) from delivery where "creation_date" <= TIMESTAMP '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP '2003-03-01 00:00:00'; count -------- 272394 (1 row) gaiaperformance=> create index creation_date_ind on delivery (creation_date); CREATE INDEX gaiaperformance=> select count(*) from delivery where "creation_date" <= TIMESTAMP '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP '2003-03-01 00:00:00'; count ------- 10371 (1 row) christian ---------------------------------------------- Christian van der Leeden Logic United GmbH Tel: 089-189488-66 Mob: 0163-3747111 www.logicunited.com ---------------------------------------------- Christian van der Leeden Logic United GmbH Tel: 089-189488-66 Mob: 0163-3747111 www.logicunited.com
Attachment
Follow up: range query with timestamp returns different result with index than without (7.3.3)
From
Christian van der Leeden
Date:
Just a followup: the reason for this misbehaviour was an invalid timestamp value. I've tried to dump/restore the db and the restore choked on a "incorrect timestamp" namely: 4714-11--2147483624 -2147483648:-2147483648:-2147483648 BC (out of the dump file) After I've elimnated the lines containing this value, and successfully restoring the db, the transcript below worked fine (w/o/ problems) Don't know how the values got there in the first place (everything in the db was created through a java app through JDBC) Christian P.S.: The db was created with 7.2.3 and then upgraded to 7.3.3 (now 7.3.4) On Thursday, August 7, 2003, at 08:52 AM, Christian van der Leeden wrote: > Hi, > > I'm have the following query: > select count(*) from delivery where "creation_date" <= TIMESTAMP > '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP '2003-03-01 > 00:00:00'; > > without any index the range query returns the correct result namely > 272394, when i create an index on creation_date, > I get 10371 as a result. > > I'm using 7.3.3 on Linux (gentoo). > > Any help appreciated, if you need more information I'm happy to > provide it. > > Here is a transcript: > > gaiaperformance=> select count(*) from delivery where "creation_date" > <= TIMESTAMP '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP > '2003-03-01 00:00:00'; > count > -------- > 272394 > (1 row) > > gaiaperformance=> create index creation_date_ind on delivery > (creation_date); > CREATE INDEX > gaiaperformance=> select count(*) from delivery where "creation_date" > <= TIMESTAMP '2003-04-01 00:00:00' and "creation_date" > TIMESTAMP > '2003-03-01 00:00:00'; > count > ------- > 10371 > (1 row) > > > christian > > > > ---------------------------------------------- > Christian van der Leeden > Logic United GmbH > Tel: 089-189488-66 Mob: 0163-3747111 > www.logicunited.com > <Christian van der Leeden.vcf> > ---------------------------------------------- > Christian van der Leeden > Logic United GmbH > Tel: 089-189488-66 Mob: 0163-3747111 > www.logicunited.com > <Christian van der Leeden.vcf> > ---------------------------------------------- Christian van der Leeden Logic United GmbH Tel: 089-189488-66 Mob: 0163-3747111 www.logicunited.com
Attachment
Re: range query with timestamp returns different result with index than without (7.3.3)
From
Tom Lane
Date:
Christian van der Leeden <lists@logicunited.com> writes: > without any index the range query returns the correct result namely > 272394, when i create an index on creation_date, > I get 10371 as a result. This is a tad hard to believe :-(. Could we see the full schema for the table? ("pg_dump -s -t delivery" would be best.) regards, tom lane
Re: Follow up: range query with timestamp returns different result with index than without (7.3.3)
From
Tom Lane
Date:
Christian van der Leeden <lists@logicunited.com> writes: > the reason for this misbehaviour was an invalid timestamp value. > I've tried to dump/restore the db and the restore choked on a > "incorrect timestamp" namely: > 4714-11--2147483624 -2147483648:-2147483648:-2147483648 BC Hmm ... I'm suspecting that that was a "minus infinity" under the hood. Is your installation built with integer timestamps, or floating point? (If you're not sure, try "pg_config --configure" and see if it mentions --enable-integer-datetimes.) Also, is the column in question of type timestamp, or timestamp with time zone? regards, tom lane
Re: Follow up: range query with timestamp returns different result with index than without (7.3.3)
From
Christian van der Leeden
Date:
Hi, I've put the database dump here: http://www.vanderleeden.de/test/databasedumps.tar (about 16 MB) It contains the ascii dump of pg_dump and the pg_dump --format c of the database. I've only got the dumps left of the original problem, since during my tries to remedy the problem (upgrade to 7.3.4 with initdb and restore) the restore failed and I don't have the original db saved... The db itself (only speaking for the current 7.3.4 build), is not configured with enabled-integer-datetimes. Creation date is defined as: creation_date | timestamp without time zone | not null CU Christian On Thursday, August 7, 2003, at 04:23 PM, Tom Lane wrote: > Christian van der Leeden <lists@logicunited.com> writes: >> the reason for this misbehaviour was an invalid timestamp value. >> I've tried to dump/restore the db and the restore choked on a >> "incorrect timestamp" namely: >> 4714-11--2147483624 -2147483648:-2147483648:-2147483648 BC > > Hmm ... I'm suspecting that that was a "minus infinity" under the hood. > Is your installation built with integer timestamps, or floating point? > (If you're not sure, try "pg_config --configure" and see if it mentions > --enable-integer-datetimes.) Also, is the column in question of type > timestamp, or timestamp with time zone? > > regards, tom lane > ---------------------------------------------- Christian van der Leeden Logic United GmbH Tel: 089-189488-66 Mob: 0163-3747111 www.logicunited.com
Attachment
Re: Follow up: range query with timestamp returns different result with index than without (7.3.3)
From
Tom Lane
Date:
Christian van der Leeden <lists@logicunited.com> writes: > The db itself (only speaking for the current 7.3.4 build), > is not configured with enabled-integer-datetimes. Okay ... [experiments a bit...] ah-hah, I know what happened. Under the hood, that value is a NaN. Observe: -- just to ease experimenting tsbug=# create cast (float8 as timestamp without time zone) without function; CREATE CAST tsbug=# select '1.8'::float8::timestamp; timestamp ------------------------ 2000-01-01 00:00:01.80 (1 row) tsbug=# select 'NaN'::float8::timestamp; timestamp --------------------------------------------------------- 4714-11--2147483625 2147483647:2147483647:2147483647 BC (1 row) NaNs behave funny in comparisons, which is doubtless what was fouling up your index. btrees assume that the trichotomy law holds :-(. I wonder how a NaN got in there? Anyway we probably ought to add some defenses against it ... at least enough to ensure that timestamp indexes stay sane. regards, tom lane