BUG #11875: char() not behaving as documented

From: b(dot)wood(at)niwa(dot)co(dot)nz
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #11875: char() not behaving as documented
Date: 2014-11-04 19:55:17
Message-ID: 20141104195517.26930.71023@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 11875
Logged by: Brent Wood
Email address: b(dot)wood(at)niwa(dot)co(dot)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.

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Andres Freund 2014-11-04 20:03:28 Re: [BUGS] [HACKERS] COPY TO returning empty result with parallel ALTER TABLE
Previous Message Sven Wegener 2014-11-04 19:35:42 Re: COPY TO returning empty result with parallel ALTER TABLE