diff options
Diffstat (limited to 'src/backend/utils/adt/varchar.c')
-rw-r--r-- | src/backend/utils/adt/varchar.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 6f8f82d8406..b6b14cb922e 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.39 1998/09/01 04:32:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.40 1998/09/25 01:46:21 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -147,7 +147,14 @@ bpchar(char *s, int32 len) if ((len == -1) || (len == VARSIZE(s))) return s; +#ifdef MULTIBYTE + /* truncate multi-byte string in a way not to break + multi-byte boundary */ + rlen = pg_mbcliplen(VARDATA(s), len - VARHDRSZ, len - VARHDRSZ); + len = rlen + VARHDRSZ; +#else rlen = len - VARHDRSZ; +#endif if (rlen > 4096) elog(ERROR, "bpchar: length of char() must be less than 4096"); @@ -367,7 +374,14 @@ varchar(char *s, int32 slen) /* only reach here if we need to truncate string... */ +#ifdef MULTIBYTE + /* truncate multi-byte string in a way not to break + multi-byte boundary */ + len = pg_mbcliplen(VARDATA(s), slen - VARHDRSZ, slen - VARHDRSZ); + slen = len + VARHDRSZ; +#else len = slen - VARHDRSZ; +#endif if (len > 4096) elog(ERROR, "varchar: length of varchar() must be less than 4096"); |