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:      [EMAIL PROTECTED]
> 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<[EMAIL PROTECTED]>
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));
 }
 
---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

                http://www.postgresql.org/about/donate

Reply via email to