Thread: BUG #11875: char() not behaving as documented

BUG #11875: char() not behaving as documented

From
b.wood@niwa.co.nz
Date:
The following bug has been logged on the website:

Bug reference:      11875
Logged by:          Brent Wood
Email address:      b.wood@niwa.co.nz
PostgreSQL version: 9.2.0
Operating system:   Linux
Description:

According to the docs
http://www.postgresql.org/docs/9.3/static/datatype-character.html)(:
" If the string to be stored is shorter than the declared length, values of
type character will be space-padded; values of type character varying will
simply store the shorter string."

Yet chars are not being padded, in fact they lose trailing spaces which are
retained by varchars. They also return length()'s less than the defined
length... which should not be the case for a padded string as defined in the
documentation.

fish=# create table test(var3 varchar(3),cha3 char(3));
CREATE TABLE
fish=# insert into test values('1','1');
INSERT 0 1
fish=# insert into test values('2 ','2 '); -- one space
INSERT 0 1
fish=# insert into test values('3  ','3  '); --two spaces
INSERT 0 1
fish=# select var3||':' as var3, cha3||':' as char3 from test;
 var3 | char3
------+-------
 1:   | 1:
 2 :  | 2:
 3  : | 3:
(3 rows)
test=# select length(var3) as v_lgth, length(cha3) as c_length from test;
 v_lgth | c_length
--------+----------
      1 |        1
      2 |        1
      3 |        1

So, in summary, varchar stores whatever feed to it and keeps trailing spaces
to max length, char type will trim off trailing spaces, and store a string
shorter than the specified length.

Re: BUG #11875: char() not behaving as documented

From
Tom Lane
Date:
b.wood@niwa.co.nz writes:
> According to the docs
> http://www.postgresql.org/docs/9.3/static/datatype-character.html)(:
> " If the string to be stored is shorter than the declared length, values of
> type character will be space-padded; values of type character varying will
> simply store the shorter string."

Quite.

> Yet chars are not being padded

Yes they are.  You are neglecting the fact that a coercion from char to
varchar/text strips trailing blanks, so that a test like this:

> fish=# select var3||':' as var3, cha3||':' as char3 from test;

proves nothing at all about how many trailing spaces there were in
cha3.

            regards, tom lane