]> granicus.if.org Git - postgresql/commitdiff
Inserting 5 characters into char(10) does not produce 5 padding spaces
authorTatsuo Ishii <ishii@postgresql.org>
Tue, 24 May 2005 15:45:34 +0000 (15:45 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Tue, 24 May 2005 15:45:34 +0000 (15:45 +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 058a1566be0f1cf3858607f6489fadc4d03782fe..19d9306e4ecdda15d5e1fc35e5f8b5ace7a276a9 100644 (file)
@@ -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;