Re: Have I found an interval arithmetic bug?

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Bruce Momjian <bruce(at)momjian(dot)us>, Bryn Llewellyn <bryn(at)yugabyte(dot)com>, pgsql-hackers list <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Have I found an interval arithmetic bug?
Date: 2021-07-28 17:05:44
Message-ID: 593114.1627491944@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

Robert Haas <robertmhaas(at)gmail(dot)com> writes:
> On Wed, Jul 28, 2021 at 11:52 AM Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>> You know, I was thinking exactly that thing earlier. Changing the
>> on-disk representation is certainly a nonstarter, but the problem
>> here stems from expecting interval_in to do something sane with inputs
>> that do not correspond to any representable value. I do not think we
>> have any other datatypes where we expect the input function to make
>> choices like that.

> A case that is perhaps more theoretically similar to the instance at
> hand is rounding during the construction of floating point values. My
> system thinks '1.00000000000000000000000001'::float = '1'::float, so
> in that case, as in this one, we've decided that it's OK to build an
> inexact representation of the input value.

Fair point, but you decided when you chose to use float that you don't
care about the differences between numbers that only differ at the
seventeenth or so decimal place. (Maybe, if you don't understand what
float is, you didn't make that choice intentionally ... but that's
a documentation issue not a code shortcoming.) However, it's fairly
hard to believe that somebody who writes '1.4 years'::interval doesn't
care about the 0.4 year. The fact that we silently convert that to,
effectively, 1.33333333... years seems like a bigger roundoff error
than one would expect.

> I am dubious that it's worth the pain of making the input function
> reject cases involving fractional units. It's true that some people
> here aren't happy with the current behavior, but they may no happier
> if we reject those cases with an error, and other people may then be
> unhappy too.

Maybe. A possible compromise is to accept only exactly-representable
fractions. Then, for instance, we'd take 1.5 years (resulting in 18
months) but not 1.4 years. Now, this might fall foul of your point about
not wanting to mislead people into expecting the system to do things it
can't; but I'd argue that the existing behavior misleads them much more.

> I think your previous idea was the best one so far: fix
> the input function so that 'X years Y months' and 'Y months X years'
> always produce the same answer, and call it good.

That would clearly be a bug fix. I'm just troubled that there are
still behaviors that people will see as bugs.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Vijaykumar Jain 2021-07-28 17:06:56 DO like block for for anonymous procedures
Previous Message Matthias Apitz 2021-07-28 16:58:08 Re: PostgreSQL reference coffee mug

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2021-07-28 17:16:19 Re: CREATE SEQUENCE with RESTART option
Previous Message Fujii Masao 2021-07-28 16:58:41 Re: CREATE SEQUENCE with RESTART option