Thread: Error in exclusion constraint error message (8.5)?

Error in exclusion constraint error message (8.5)?

From
hubert depesz lubaczewski
Date:
Hi,
I tried to use exclusion for time ranges, with this table and data:

CREATE TABLE test (
    from_ts TIMESTAMPTZ,
    to_ts   TIMESTAMPTZ,
    CHECK ( from_ts < to_ts ),
    CONSTRAINT overlapping_times EXCLUDE USING GIST (
        box(
            point( extract(epoch FROM from_ts at time zone 'UTC'), extract(epoch FROM from_ts at time zone 'UTC') ),
            point( extract(epoch FROM to_ts at time zone 'UTC')  , extract(epoch FROM to_ts at time zone 'UTC') )
        ) WITH &&
    )
);
INSERT INTO test ( from_ts, to_ts ) VALUES ( '2009-01-01 01:23:45 EST', '2009-01-10 23:45:12 EST' );
INSERT INTO test ( from_ts, to_ts ) VALUES ( '2009-02-01 01:23:45 EST', '2009-02-10 23:45:12 EST' );
INSERT INTO test ( from_ts, to_ts ) VALUES ( '2009-01-08 00:00:00 EST', '2009-01-15 23:59:59 EST' );

3rd insert fails (correctly), but I have doubts about its error message, which was:

psql:z.sql:18: ERROR:  conflicting key value violates exclusion constraint "overlapping_times"
DETAIL:  Key (box(point(date_part('epoch'::text, timezone('UTC'::text, from_ts)), date_part('epoch'::text,
timezone('UTC'::text,from_ts))), point(date_part('epoch'::text, timezone('UTC'::text, to_ts)), date_part('epoch'::text,
timezone('UTC'::text,to_ts)))))=((1232078399,1232078399),(1231387200,1231387200)) conflicts with existing key
(box(point(date_part('epoch'::text,timezone('UTC'::text, from_ts)), date_part('epoch'::text, timezone('UTC'::text,
from_ts))),point(date_part('epoch'::text, timezone('UTC'::text, to_ts)), date_part('epoch'::text, timezone('UTC'::text,
to_ts)))))=((1232078399,1232078399),(1231387200,1231387200)).

Please not that both box values are the same, and relate to row:
( '2009-01-08 00:00:00 EST', '2009-01-15 23:59:59 EST' )
while I would assume that one of the boxes in error message should relate to row:
( '2009-01-01 01:23:45 EST', '2009-01-10 23:45:12 EST' )
I.e. contain box: (1231645512,1231645512),(1230787425,1230787425)

Is it my lack of understanding? If yes, what is the rationale behind providing the same value twice?

Best regards,

depesz

--
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007

Re: Error in exclusion constraint error message (8.5)?

From
Tom Lane
Date:
hubert depesz lubaczewski <depesz@depesz.com> writes:
> 3rd insert fails (correctly), but I have doubts about its error message, which was:

> psql:z.sql:18: ERROR:  conflicting key value violates exclusion constraint "overlapping_times"
> DETAIL:  Key (box(point(date_part('epoch'::text, timezone('UTC'::text, from_ts)), date_part('epoch'::text,
timezone('UTC'::text,from_ts))), point(date_part('epoch'::text, timezone('UTC'::text, to_ts)), date_part('epoch'::text,
timezone('UTC'::text,to_ts)))))=((1232078399,1232078399),(1231387200,1231387200)) conflicts with existing key
(box(point(date_part('epoch'::text,timezone('UTC'::text, from_ts)), date_part('epoch'::text, timezone('UTC'::text,
from_ts))),point(date_part('epoch'::text, timezone('UTC'::text, to_ts)), date_part('epoch'::text, timezone('UTC'::text,
to_ts)))))=((1232078399,1232078399),(1231387200,1231387200)).

Yeah, this is a bug; and it reflects a wrong test not only a wrong error
message.  Patch applied --- thanks for the report!

            regards, tom lane

Re: Error in exclusion constraint error message (8.5)?

From
Greg Stark
Date:
On Sat, Jan 2, 2010 at 1:37 PM, hubert depesz lubaczewski
<depesz@depesz.com> wrote:
> =A0 =A0CONSTRAINT overlapping_times EXCLUDE USING GIST (
> =A0 =A0 =A0 =A0box(
> =A0 =A0 =A0 =A0 =A0 =A0point( extract(epoch FROM from_ts at time zone 'UT=
C'), extract(epoch FROM from_ts at time zone 'UTC') ),
> =A0 =A0 =A0 =A0 =A0 =A0point( extract(epoch FROM to_ts at time zone 'UTC'=
) =A0, extract(epoch FROM to_ts at time zone 'UTC') )
> =A0 =A0 =A0 =A0) WITH &&
>

Hm, this would be easier to write as:

CONSTRAINT overlapping_times EXCLUDE USING GIST (
  tinterval(from_ts::abstime, to_ts::abstime) WITH &&

But that still seems a bit more complex than ideal. Would it be
reasonable to have a tinterval() constructor which takes timestamptz
data types? Then you could just write

CONSTRAINT overlapping_times
  EXCLUDE USING GIST (tinterval(from_ts, to_ts)) USING &&


--=20
greg

Re: Error in exclusion constraint error message (8.5)?

From
Tom Lane
Date:
Greg Stark <gsstark@mit.edu> writes:
> But that still seems a bit more complex than ideal. Would it be
> reasonable to have a tinterval() constructor which takes timestamptz
> data types?

No, because that would be encouraging people to use tinterval ;-).
That type needs to die.

If Jeff doesn't finish his range-type stuff soon, maybe a tinterval
replacement that hasn't got a Y2038 problem would be in order.  But
we shouldn't put any more effort into tinterval as such.

(BTW, tinterval hasn't got a gist opclass either, so the constructor
is the least of the missing pieces here.)

            regards, tom lane