From a90e9d662e15b348aab68fd8d725a029e60ae2fa Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Tue, 24 May 2005 15:45:34 +0000 Subject: Inserting 5 characters into char(10) does not produce 5 padding spaces if they are two-byte multibyte characters. Same thing can be happen if octet_length(multibyte_chars) == n where n is char(n). Long standing bug since 7.3 days. Per report and fix from Yoshiyuki Asaba. --- src/backend/parser/parse_expr.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/backend/parser/parse_expr.c') diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 058a1566be0..19d9306e4ec 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.181 2005/04/06 16:34:06 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.182 2005/05/24 15:45:34 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -18,6 +18,7 @@ #include "catalog/pg_operator.h" #include "catalog/pg_proc.h" #include "commands/dbcommands.h" +#include "mb/pg_wchar.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/params.h" @@ -34,7 +35,6 @@ #include "utils/lsyscache.h" #include "utils/syscache.h" - bool Transform_null_equals = false; static Node *transformParamRef(ParseState *pstate, ParamRef *pref); @@ -1553,7 +1553,13 @@ exprTypmod(Node *expr) { case BPCHAROID: if (!con->constisnull) - return VARSIZE(DatumGetPointer(con->constvalue)); + { + int32 len = VARSIZE(DatumGetPointer(con->constvalue)) - VARHDRSZ; + + if (pg_database_encoding_max_length() > 1) + len = pg_mbstrlen_with_len(VARDATA(DatumGetPointer(con->constvalue)), len); + return len + VARHDRSZ; + } break; default: break; -- cgit v1.2.3