Re: BUG #3413: character string or multibyte character to "char" - Mailing list pgsql-bugs

From Toru SHIMOGAKI
Subject Re: BUG #3413: character string or multibyte character to "char"
Date
Msg-id 4680F3CE.7090702@oss.ntt.co.jp
Whole thread Raw
In response to BUG #3413: character string or multibyte character to "char"  ("Toru SHIMOGAKI" <shimogaki.toru@oss.ntt.co.jp>)
List pgsql-bugs
This is a sample patch for charin() and charrecv(). I'm not sure for charout();
it can return non-ASCII character...


Toru SHIMOGAKI wrote:
> The following bug has been logged online:
>
> Bug reference:      3413
> Logged by:          Toru SHIMOGAKI
> Email address:      shimogaki.toru@oss.ntt.co.jp
> PostgreSQL version: 8.2.4
> Operating system:   Red Hat Enterprise Linux AS4
> Description:        character string or multibyte character to "char"
> Details:
>
> When a character string or a multibyte character is inserted to "char"
> column, no error occurs. Is this a bug? Should it be checked as "not single
> character" in charin(), charrecv() and charout()?
>
> Anyway, I can't find any spec descriptions in the following document;
>   http://www.postgresql.org/docs/8.2/static/datatype-character.html
>
> Best regards,
>
>
> ----
>
> postgres=# select version();
>                                               version
> ----------------------------------------------------------------------------
> -----------------------
>  PostgreSQL 8.2.4 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.6
> 20060404 (Red Hat 3.4.6-3)
> (1 row)
>
> postgres=# create table test(flag "char");
> CREATE TABLE
> postgres=# \d test
>      Table "public.test"
>  Column |  Type  | Modifiers
> --------+--------+-----------
>  flag   | "char" |
>
> postgres=# insert into test values('a');
> INSERT 0 1
> postgres=# insert into test values('bb');
> INSERT 0 1
> postgres=# insert into test values('eeeee');
> INSERT 0 1
> postgres=# insert into test values('あ');
> INSERT 0 1
> postgres=# select * from test;
>  flag
> ------
>  a
>  b
>  e
>
> (4 rows)
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: You can help support the PostgreSQL project by donating at
>
>                 http://www.postgresql.org/about/donate
>
>

--
Toru SHIMOGAKI<shimogaki.toru@oss.ntt.co.jp>
NTT Open Source Software Center
Index: src/backend/utils/adt/char.c
===================================================================
--- src/backend/utils/adt/char.c    (revision 1156)
+++ src/backend/utils/adt/char.c    (working copy)
@@ -34,6 +34,11 @@
 {
     char       *ch = PG_GETARG_CSTRING(0);

+    if (ch[0] != '\0' && ch[1] != '\0')
+        ereport(ERROR,
+            (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+             errmsg("value too long for type \"char\"")));
+
     PG_RETURN_CHAR(ch[0]);
 }

@@ -67,6 +72,11 @@
 {
     StringInfo    buf = (StringInfo) PG_GETARG_POINTER(0);

+    if (buf->len > 1)
+        ereport(ERROR,
+            (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+             errmsg("value too long for type \"char\"")));
+
     PG_RETURN_CHAR(pq_getmsgbyte(buf));
 }


pgsql-bugs by date:

Previous
From: "Toru SHIMOGAKI"
Date:
Subject: BUG #3413: character string or multibyte character to "char"
Next
From: Zdenek Kotala
Date:
Subject: Re: REVOKE CREATE does not work on default tablespace