Re: datatype of constant is not propagated into aggregate query
От | Pavel Stehule |
---|---|
Тема | Re: datatype of constant is not propagated into aggregate query |
Дата | |
Msg-id | CAFj8pRCbp_Ro9+ZxQN4AW2mOL3yQc=8GtR08=K5j0RpA7oiU0g@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: datatype of constant is not propagated into aggregate query ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>) |
Список | pgsql-hackers |
Hello 2012/3/11 Kevin Grittner <Kevin.Grittner@wicourts.gov>: > 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). it doesn't work with enums where must not be any dependency on locale postgres=# create type e as enum('A','B'); CREATE TYPE postgres=# create table hh (_e e); CREATE TABLE postgres=# insert into hh select 'A'; INSERT 0 1 postgres=# insert into hh select distinct 'A'; ERROR: column "_e" is of type e but expression is of type text LINE 1: insert into hh select distinct 'A'; ^ HINT: You will need to rewrite or cast the expression. > > Arguably this could be improved, but so far nobody has figured out > anything better. This is working as intended. ook Regards Pavel > > -Kevin
В списке pgsql-hackers по дате отправления: