BUG #1783: A function using char variables does not behave the same way between 7.4 and 8.0

From: "Laurent HERVE" <laurent-herve(at)club-internet(dot)fr>
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #1783: A function using char variables does not behave the same way between 7.4 and 8.0
Date: 2005-07-24 15:13:11
Message-ID: 20050724151311.544F0F0B08@svr2.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


The following bug has been logged online:

Bug reference: 1783
Logged by: Laurent HERVE
Email address: laurent-herve(at)club-internet(dot)fr
PostgreSQL version: 8.0.1
Operating system: Linux Mandriva LE 2005 x86_64
Description: A function using char variables does not behave the same
way between 7.4 and 8.0
Details:

I am upgrading a 7.4 database to PostgreSQL 8.0.
During my tests, I found that the results of a function weren't like I
expected to.
I am using a 8.0.1 but I didn't find anything related to that problem on the
release note for later versions.

ez33=# select version();
version
----------------------------------------------------------------------------
--------------------------------------------------------------
PostgreSQL 8.0.1 on x86_64-mandrake-linux-gnu, compiled by GCC
x86_64-mandrake-linux-gnu-gcc (GCC) 3.4.3 (Mandrakelinux 10.2 3.4.3-7mdk)
(1 ligne)

my fonction is :

create or replace function ctb_remove_extra_spaces (text) returns text as '
declare
p_string alias for $1;
tmp_string text :='''';
cln_string text :=''''; /* cleaned string */
i integer :=0;
pre_car char(1) :='''';
car char(1) :='''';
a varchar;
begin
tmp_string:=trim(p_string);
for i in 1 .. length(tmp_string)
loop
car := substring(tmp_string, i ,1);
raise notice ''% / % % %'',i,pre_car,car,cln_string;
-- raise notice ''%'',car;
if (car = '' '' and pre_car <> '' '')
then
a:=ascii(car);
raise notice ''ASCII = %'',a;
cln_string:=cln_string||car;
end if;
if (car <> '' '')
then
cln_string:=cln_string||car;
end if;
pre_car:=car;
end loop;
return cln_string;
end;
' language 'plpgsql';

A select ctb_remove_extra_spaces(' abc defghi '); should give 'abc
defghi'

Running it on PG 8 gives :

ez33=# select ctb_remove_extra_spaces(' abc defghi ');
NOTICE: 1 / a
NOTICE: 2 / a b a
NOTICE: 3 / b c ab
NOTICE: 4 / c abc
NOTICE: ASCII = 0
NOTICE: 5 / abc
NOTICE: 6 / abc
NOTICE: 7 / d abc
NOTICE: 8 / d e abcd
NOTICE: 9 / e f abcde
NOTICE: 10 / f g abcdef
NOTICE: 11 / g h abcdefg
NOTICE: 12 / h i abcdefgh
ctb_remove_extra_spaces
-------------------------
abcdefghi
(1 ligne)

which is a wrong result.

But when I change the datatypes char(1) to varchar, I get :

ez33=# select ctb_remove_extra_spaces(' abc defghi ');
NOTICE: 1 / a
NOTICE: 2 / a b a
NOTICE: 3 / b c ab
NOTICE: 4 / c abc
NOTICE: ASCII = 32
NOTICE: 5 / abc
NOTICE: 6 / abc
NOTICE: 7 / d abc
NOTICE: 8 / d e abc d
NOTICE: 9 / e f abc de
NOTICE: 10 / f g abc def
NOTICE: 11 / g h abc defg
NOTICE: 12 / h i abc defgh
ctb_remove_extra_spaces
-------------------------
abc defghi
(1 ligne)

which is right.

Well it looks like a bug ... but probably I had better using varchar in my
applications...

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2005-07-24 17:32:52 Re: BUG #1783: A function using char variables does not behave the same way between 7.4 and 8.0
Previous Message Mohamed 2005-07-23 17:09:14 BUG #1782: unexpected EOF on client connection