Обсуждение: Type of bare text strings
What type are bare strings considered if they haven't been cast? I'm curious as to how the first case is of size 5, and how the last case is 301... decibel=# select pg_column_size('test'); 5 decibel=# select pg_column_size('test'::varchar); 8 decibel=# select pg_column_size('test'::text); 8 decibel=# select pg_column_size('test'::name); 64 decibel=# select pg_column_size('test'::char(4)); 8 decibel=# select pg_column_size('123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); 301 decibel=# -- Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com Pervasive Software http://pervasive.com work: 512-231-6117 vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461
Jim C. Nasby wrote: > What type are bare strings considered if they haven't been cast? I'm curious as > to how the first case is of size 5, and how the last case is 301... > > decibel=# select pg_column_size('test'); > 5 "unknown". This seems to be a cstring (i.e. length 5 considering the trailing \0) > decibel=# select pg_column_size('test'::varchar); > 8 > decibel=# select pg_column_size('test'::text); > 8 > decibel=# select pg_column_size('test'::char(4)); > 8 4 fixed varlena + 4 string length > decibel=# select pg_column_size('test'::name); > 64 name is fixed 64 bytes (not varlena) > decibel=# select pg_column_size('123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); > 301 Same as the first case. (There are actual 300 chars here according to my count, is that right?) -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.
Alvaro Herrera wrote: > Jim C. Nasby wrote: > > What type are bare strings considered if they haven't been cast? I'm curious as > > to how the first case is of size 5, and how the last case is 301... > > > > decibel=# select pg_column_size('test'); > > 5 > > "unknown". This seems to be a cstring (i.e. length 5 considering the > trailing \0) Yup. This is handled by this code: else if (typlen == -2) { /* cstring */ result = strlen(DatumGetCString(value)) + 1; } -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Alvaro Herrera <alvherre@commandprompt.com> writes: > "unknown". This seems to be a cstring (i.e. length 5 considering the > trailing \0) Yeah. "unknown" used to have the same representation as "text", ie varlena, but I changed it recently because I realized that the normal thing we do with an "unknown" literal is feed it to some datatype's input converter. Making it the same as cstring saves a conversion step. regards, tom lane