Thread: difference between implicit/explicit cast of integer to interval

hi,

postgresql-9.1.3

the difference between two dates is an integral
number of days as demonstrated by:

    select select date '2012-08-03' - date '2012-08-01';
     ?column?
    ----------
            2

i just noticed that i had some (buggy) code that
stored the difference between two dates into an
interval variable rather than integer variable.
the result was that is was storing the interval
2 seconds rather than the integer 2 (to represent
days). so when i added that interval to another date,
it had no effect.

strangely, i tried to explicitly cast such an integral
number of days into an interval and it failed to allow it.
the following code demonstrates this. the first two notices
are output but an error happens before the third.

    do $$
    declare
        huh1 interval;
        huh2 integer;
    begin
        huh1 := date '2012-08-03' - date '2012-08-01';
        raise notice '%', huh1;
        huh2 := date '2012-08-03' - date '2012-08-01';
        raise notice '%', huh2;
        huh1 := cast(date '2012-08-03' - date '2012-08-01' as interval);
        raise notice '%', huh1;
    end
    $$;

    DO
    00:00:02
    2
    ERROR:  cannot cast type integer to interval
    LINE 1: SELECT cast(date '2012-08-03' - date '2012-08-01' as interva...
                   ^
    QUERY:  SELECT cast(date '2012-08-03' - date '2012-08-01' as interval)

i supposed my questions are:

Q1) if an integer cannot be explicitly cast into an interval, what is happening
when a date difference is stored in an interval variable to allow it to happen?

Q2) when it happens, why is the number of days stored in the interval as seconds
rather than days?

Q3) is a bug in plpgsql?

cheers,
raf


Re: difference between implicit/explicit cast of integer to interval

From
Tom Lane
Date:
raf <raf@raf.org> writes:
> Q1) if an integer cannot be explicitly cast into an interval, what is happening
> when a date difference is stored in an interval variable to allow it to happen?

plpgsql is really lax about type coercions.  It typically does them by
converting the source value to text and then converting that string to
the target type.  If we were designing that language today, I doubt
we'd have accepted such a definition, but changing it now would break
a lot of code ...

            regards, tom lane