Oh! Great answer! Thats what i want to know!!! 
Thank you Pavel about explanation!!!

Alex Ignatov
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company

> On 04 Mar 2016, at 20:45, Pavel Stehule <pavel.steh...@gmail.com> wrote:
> 
> Hi
> 
> 2016-03-04 18:29 GMT+01:00 Melvin Davidson <melvin6...@gmail.com>:
>> Probably because pg_typeof() returns the OID of a COLUMN in a table def.. 
>> Strings literals do not have oid's.
> 
> no this is not a reason.
> 
> String literal has fictive "unknown" type. Real type is derivated from 
> context - operators, function parameters. pg_typeof has parameter of type 
> "any", and then no conversions from "unknown" is possible.
> 
> I don't known why "text" type is not default for string literal, but I see 
> some logical relations. If we cast "unknown" to "text" early, then we will be 
> limited by "text" type available conversions. Now, it is possible, but years 
> ago, the cast between "text" type and others was disallowed. Still we require 
> explicit cast, and I see it as benefit. Hidden cast (implicit cast) are query 
> performance killers. So "unknown" type requires less explicit casting, 
> because there are implicit casts from this type to any type.
> 
> I am not sure if comparation with numbers is valid. Numbers are much more 
> consistent class than string literals - more implicit casts over this class 
> is there.
> 
> Probably this design can be enhanced, and more consistent - "text" type can 
> be used as fallback type.
> 
> Regards
> 
> Pavel
>  
>> 
>> http://www.postgresql.org/docs/9.4/interactive/functions-info.html
>> 
>> "pg_typeof returns the OID of the data type of the value that is passed to 
>> it. This can be helpful for troubleshooting or dynamically constructing SQL 
>> queries. The   function is declared as returning regtype,   which is an OID 
>> alias type (see Section 8.18); this means that it is the same as an OID for 
>> comparison purposes but displays as a type name. For example:"
>> 
>> Please in the future, ALWAYS specify your PostgreSQL version and O/S, 
>> regardless of whether or not you thinnk it is pertinent.
>> 
>>> On Fri, Mar 4, 2016 at 12:17 PM, Alex Ignatov <a.igna...@postgrespro.ru> 
>>> wrote:
>>> Hello!
>>> Why string literal like 'Hello world!' doesnt automagicaly cast to text 
>>> type?
>>> 
>>> postgres=# select pg_typeof('Hello world');
>>>  pg_typeof
>>> -----------
>>>  unknown
>>> (1 row)
>>> 
>>> But for example literal like 1.1 automagically cast to numeric( not float8, 
>>> float4, whatever)
>>> postgres=# select pg_typeof(1.1);
>>>  pg_typeof
>>> -----------
>>>  numeric
>>> (1 row)
>>> 
>>> That why we cant do the following without explicit type casting:
>>> postgres=# select t.c||' world' from (select 'Hello' as c) as t;
>>> ERROR:  failed to find conversion function from unknown to text
>>> 
>>> but that ok:
>>> postgres=# select t.c||' world' from (select 'Hello'::text as c) as t;
>>>   ?column?
>>> -------------
>>>  Hello world
>>> (1 row)
>>> 
>>> or this is ok too:
>>> postgres=# select t.c::text||' world' from (select 'Hello' as c) as t;
>>>   ?column?
>>> -------------
>>>  Hello world
>>> (1 row)
>>> 
>>> Sure we can create our cast:
>>> postgres=# create cast (unknown as text) with inout as implicit;
>>> CREATE CAST
>>> and after that we have:
>>> postgres=# select t.c||' world' from (select 'Hello' as c) as t;
>>>   ?column?
>>> -------------
>>>  Hello world
>>> (1 row)
>>> 
>>> But why we don't have this type cast by default in Postgres? Is there any 
>>> fundamental restriction on that or there is some reasons for that?
>>> 
>>> 
>>> -- 
>>> Alex Ignatov
>>> Postgres Professional: http://www.postgrespro.com
>>> The Russian Postgres Company
>>> 
>>> 
>>> 
>>> -- 
>>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>>> To make changes to your subscription:
>>> http://www.postgresql.org/mailpref/pgsql-general
>> 
>> 
>> 
>> -- 
>> Melvin Davidson
>> I reserve the right to fantasize.  Whether or not you 
>> wish to share my fantasy is entirely up to you. 
> 

Reply via email to