88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.60.2.1 2000/07/07 21:29:57 tgl Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.60.2.2 2000/11/02 05:11:42 ishii Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -79,7 +79,17 @@ bpcharin(char *s, int dummy, int32 atttypmod)
7979atttypmod = len + VARHDRSZ ;
8080}
8181else
82+ #ifdef MULTIBYTE
83+ {
84+ /*
85+ * truncate multi-byte string preserving multi-byte
86+ * boundary
87+ */
88+ len = pg_mbcliplen (s ,atttypmod - VARHDRSZ ,atttypmod - VARHDRSZ );
89+ }
90+ #else
8291len = atttypmod - VARHDRSZ ;
92+ #endif
8393
8494result = (char * )palloc (atttypmod );
8595VARSIZE (result )= atttypmod ;
@@ -96,7 +106,11 @@ bpcharin(char *s, int dummy, int32 atttypmod)
96106#endif
97107
98108/* blank pad the string if necessary */
109+ #ifdef MULTIBYTE
110+ for (;i < atttypmod - VARHDRSZ ;i ++ )
111+ #else
99112for (;i < len ;i ++ )
113+ #endif
100114* r ++ = ' ' ;
101115return result ;
102116}
@@ -161,7 +175,7 @@ bpchar(char *s, int32 len)
161175#ifdef MULTIBYTE
162176
163177/*
164- * truncate multi-byte stringin a way not to break multi-byte
178+ * truncate multi-byte stringpreserving multi-byte
165179 * boundary
166180 */
167181if (VARSIZE (s )> len )
@@ -326,7 +340,14 @@ varcharin(char *s, int dummy, int32 atttypmod)
326340
327341len = strlen (s )+ VARHDRSZ ;
328342if (atttypmod >= (int32 )VARHDRSZ && len > atttypmod )
329- len = atttypmod ;/* clip the string at max length */
343+ {
344+ /* clip the string at max length */
345+ #ifdef MULTIBYTE
346+ len = pg_mbcliplen (s ,len - VARHDRSZ ,atttypmod - VARHDRSZ )+ VARHDRSZ ;
347+ #else
348+ len = atttypmod ;
349+ #endif
350+ }
330351
331352result = (char * )palloc (len );
332353VARSIZE (result )= len ;
@@ -388,7 +409,7 @@ varchar(char *s, int32 slen)
388409#ifdef MULTIBYTE
389410
390411/*
391- * truncate multi-byte stringin a way not to break multi-byte
412+ * truncate multi-byte stringpreserving the multi-byte
392413 * boundary
393414 */
394415len = pg_mbcliplen (VARDATA (s ),slen - VARHDRSZ ,slen - VARHDRSZ );