Re: BUG #6124: overlaps

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: depesz(at)depesz(dot)com
Cc: Ludek Bouska <ludek(at)bouska(dot)info>, pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #6124: overlaps
Date: 2011-07-20 14:59:15
Message-ID: 11431.1311173955@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

hubert depesz lubaczewski <depesz(at)depesz(dot)com> writes:
> On Wed, Jul 20, 2011 at 06:09:48AM +0000, Ludek Bouska wrote:
>> script
>> select ('20110720'::date,'20110721'::date) overlaps
>> ('20110721'::date,'20110721'::date)
>> gives false.

> docs clearly state the reason:
> http://www.postgresql.org/docs/current/interactive/functions-datetime.html

> This expression yields true when two time periods (defined by their
> endpoints) overlap, false when they do not overlap. The endpoints can be
> specified as pairs of dates, times, or time stamps; or as a date, time, or
> time stamp followed by an interval. When a pair of values is provided,
> either the start or the end can be written first; OVERLAPS automatically
> takes the earlier value of the pair as the start. Each time period is
> considered to represent the half-open interval start <= time < end, unless
> start and end are equal in which case it represents that single time
> instant. This means for instance that two time periods with only an endpoint
> in common do not overlap.

Yeah. This is an explanation in words of the behavior defined by the
SQL spec. The actual spec text defines the result of (D1, E1) OVERLAPS
(D2, E2) for the non-interval cases thus:

3) If D1 is the null value or if E1 < D1, then let S1 = E1 and let
T1 = D1. Otherwise, let S1 = D1 and let T1 = E1.

5) If D2 is the null value or if E2 < D2, then let S2 = E2 and let
T2 = D2. Otherwise, let S2 = D2 and let T2 = E2.

6) The result of the <overlaps predicate> is the result of the
following expression:

( S1 > S2 AND NOT ( S1 >= T2 AND T1 >= T2 ) )
OR
( S2 > S1 AND NOT ( S2 >= T1 AND T2 >= T1 ) )
OR
( S1 = S2 AND ( T1 <> T2 OR T1 = T2 ) )

If you work through that you'll see that indeed these values should
produce a false result: we have S2 > S1, S2 >= T1, T2 >= T1.

regards, tom lane

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Robert Haas 2011-07-20 19:03:40 Re: BUG #6121: error msg feature request for initial server tasks
Previous Message Renzo Kottmann 2011-07-20 12:24:32 Re: Ambiguos OPERATOR items in pg_restore manifest file