Re: datatype of constant is not propagated into aggregate query - Mailing list pgsql-hackers

From Kevin Grittner
Subject Re: datatype of constant is not propagated into aggregate query
Date
Msg-id 4F5C7DEF02000025000460CB@gw.wicourts.gov
Whole thread Raw
Responses Re: datatype of constant is not propagated into aggregate query
List pgsql-hackers
Pavel Stehule  wrote:
> create table t1(d date, n integer);
>
> postgres=# insert into t1 select '2001-01-01', 1 from
> generate_series(1,3);
> INSERT 0 3
>
> but
>
> postgres=# insert into t1 select distinct '2001-01-01', 1 from
> generate_series(1,3);
> ERROR: column "d" is of type date but expression is of type text
This has been discussed many times before.  If you use a date
literal, you are fine.  For example, this does work:
insert into t1 select distinct date '2001-01-01', 1 from generate_series(1,3);
> HINT: You will need to rewrite or cast the expression.
The hint is even on point.
In PostgreSQL a quoted literal is taken as type "unknown" and it can
often be coerced to the right type based on its usage.  The reason
the first example works is that the literal of unknown type is being
assigned to a date column in the insert.  In the second example it is
being used for DISTINCT, and we don't look deeper to see what is
later done with that later.  Type matters for DISTINCT, because
(depending locale) you might want '2011-12-31' and '12/31/2011' to be
taken as identical values.  In the absence of clues as to what type
to use, PostgreSQL defaults to text, and you can't assign a text
value to the date column (without a cast).
Arguably this could be improved, but so far nobody has figured out
anything better.  This is working as intended.
-Kevin


pgsql-hackers by date:

Previous
From: Stefan Keller
Date:
Subject: Re: pg_prewarm
Next
From: Tom Lane
Date:
Subject: Re: datatype of constant is not propagated into aggregate query