Обсуждение: interval_scale not work as expected?

Поиск
Список
Период
Сортировка

interval_scale not work as expected?

От
jian he
Дата:
Hi.

    (
        SELECT interval(0) '1 day 01:23:45.6789'
        union all
        SELECT interval(1) '1 day 01:23:45.6789'
        union all
        SELECT interval(2) '1 day 01:23:45.6789'
        union all
        SELECT interval(3) '1 day 01:23:45.6789'
        union all
        SELECT interval(4) '1 day 01:23:45.6789'
    )
    EXCEPT all
    (
        SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval,2147418112)
        union all
        SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval,2147418113)
        union all
        SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval,2147418114)
        union all
        SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval,2147418115)
        union all
        SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval,2147418116)
    );

https://dbfiddle.uk/zT8OByj1
the above works even in postgres 9.6. I debugged, then found out these
magic values like 2147418112.

I thought:
SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval, 0)
is same as
SELECT interval(0) '1 day 01:23:45.6789'

is this a bug in AdjustIntervalForTypmod?



Re: interval_scale not work as expected?

От
Tom Lane
Дата:
jian he <jian.universality@gmail.com> writes:
> I thought:
> SELECT pg_catalog.interval('1 day 01:23:45.6789'::interval, 0)
> is same as
> SELECT interval(0) '1 day 01:23:45.6789'

[ shrug ]  No, it isn't.  Interval typmods have to carry a lot
more than just the fractional precision, because of all the
weird syntactic baggage that the SQL spec has for interval
types (i.e., YEAR TO MONTH and other options).  timestamp.h
has (some of) the details about what gets packed into an
interval typmod.

Even with simpler types, there generally isn't a one-to-one
correlation between user-visible precision and the encoded
typmod.

            regards, tom lane