Inserting 5 characters into char(10) does not produce 5 padding spaces
authorTatsuo Ishii <ishii@postgresql.org>
Tue, 24 May 2005 23:15:05 +0000 (23:15 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Tue, 24 May 2005 23:15:05 +0000 (23:15 +0000)
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

index b40e89532761463707a83d5b4a67256fce3ff9a5..ce9ec2177c0a9d83147e59f8588bf76c7f971ada 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.163.2.1 2004/04/18 18:13:31 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.163.2.2 2005/05/24 23:15:05 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"
@@ -1356,7 +1357,13 @@ exprTypmod(Node *expr)
                {
                    case BPCHAROID:
                        if (!con->constisnull)
-                           return VARSIZE(DatumGetPointer(con->constvalue));
+                       {
+                           int32 len = VARSIZE(DatumGetPointer(con->constvalue));
+
+                           if (pg_database_encoding_max_length() > 1)
+                               len = pg_mbstrlen_with_len(VARDATA(DatumGetPointer(con->constvalue)), len);
+                           return len;
+                       }
                        break;
                    default:
                        break;