Fix for inserting/copying longer multibyte strings into bpchar data
authorTatsuo Ishii
Sun, 26 Nov 2000 11:35:23 +0000 (11:35 +0000)
committerTatsuo Ishii
Sun, 26 Nov 2000 11:35:23 +0000 (11:35 +0000)
types.

src/backend/utils/adt/varchar.c

index 9d6f9d087504293d1f6548c14789b5794873a3fe..3c58a25461965158b8fe296ceab558a45e554c68 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.70 2000/11/21 21:16:02 petere Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.71 2000/11/26 11:35:23 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -79,7 +79,17 @@ bpcharin(PG_FUNCTION_ARGS)
        atttypmod = len + VARHDRSZ;
    }
    else
+#ifdef MULTIBYTE
+   {
+       /*
+        * truncate multi-byte string preserving multi-byte
+        * boundary
+        */
+       len = pg_mbcliplen(s, atttypmod - VARHDRSZ, atttypmod - VARHDRSZ);
+   }
+#else
        len = atttypmod - VARHDRSZ;
+#endif
 
    result = (BpChar *) palloc(atttypmod);
    VARATT_SIZEP(result) = atttypmod;
@@ -96,7 +106,11 @@ bpcharin(PG_FUNCTION_ARGS)
 #endif
 
    /* blank pad the string if necessary */
+#ifdef MULTIBYTE
+   for (; i < atttypmod - VARHDRSZ; i++)
+#else
    for (; i < len; i++)
+#endif
        *r++ = ' ';
 
    PG_RETURN_BPCHAR_P(result);
@@ -329,7 +343,11 @@ varcharin(PG_FUNCTION_ARGS)
 
    len = strlen(s) + VARHDRSZ;
    if (atttypmod >= (int32) VARHDRSZ && len > atttypmod)
+#ifdef MULTIBYTE
+       len = pg_mbcliplen(s, len - VARHDRSZ, atttypmod - VARHDRSZ) + VARHDRSZ;
+#else
        len = atttypmod;        /* clip the string at max length */
+#endif
 
    result = (VarChar *) palloc(len);
    VARATT_SIZEP(result) = len;
@@ -383,7 +401,7 @@ varchar(PG_FUNCTION_ARGS)
 #ifdef MULTIBYTE
 
    /*
-    * truncate multi-byte string in a way not to break multi-byte
+    * truncate multi-byte string preserving multi-byte
     * boundary
     */
    len = pg_mbcliplen(VARDATA(s), slen - VARHDRSZ, slen - VARHDRSZ);