Re: character type value is not padded with spaces

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Yoshiyuki Asaba <y-asaba(at)sra(dot)co(dot)jp>
Cc: pgsql-patches(at)postgresql(dot)org
Subject: Re: character type value is not padded with spaces
Date: 2005-06-04 20:56:46
Message-ID: 200506042056.j54KukW00526@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-patches


I see Tatsuo already applied this, which is great. I added a little
comment:

/* if multi-byte, take len and find # characters */

---------------------------------------------------------------------------

Yoshiyuki Asaba wrote:
> Character type value including multibyte characters is not padded
> with spaces. It reproduces at 7.3.x, 7.4.x and 8.0.x.
>
> create table t (a char(10));
> insert into t values ('XXXXX'); -- X is 2byte character.
>
> I expect that 'XXXXX ' is inserted. But 'XXXXX' is inserted.
>
> select a, octed_length(a) from t;
>
> a | octet_length
> -------+--------------
> XXXXX | 10
>
> If padded with spaces, octet_length(a) is 15. This problem is caused
> that string length is calculated by byte length(VARSIZE) in
> exprTypmod().
>
> I attache the patch for this problem.
>
> Regards,
>
> --
> Yoshiyuki Asaba
> y-asaba(at)sra(dot)co(dot)jp

> *** parse_expr.c.orig 2005-01-13 02:32:36.000000000 +0900
> --- parse_expr.c 2005-05-22 17:12:37.000000000 +0900
> ***************
> *** 18,23 ****
> --- 18,24 ----
> #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,40 ****
> #include "utils/lsyscache.h"
> #include "utils/syscache.h"
>
> -
> bool Transform_null_equals = false;
>
> static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref);
> --- 35,40 ----
> ***************
> *** 1491,1497 ****
> {
> case BPCHAROID:
> if (!con->constisnull)
> ! return VARSIZE(DatumGetPointer(con->constvalue));
> break;
> default:
> break;
> --- 1491,1503 ----
> {
> case BPCHAROID:
> if (!con->constisnull)
> ! {
> ! 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;

>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Gevik babakhani 2005-06-04 20:59:19 PGDN source browser
Previous Message Bruce Momjian 2005-06-04 19:45:57 Re: WAL bypass for CTAS

Browse pgsql-patches by date

  From Date Subject
Next Message Joe Conway 2005-06-04 21:01:18 Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
Previous Message Bruce Momjian 2005-06-04 20:42:34 Re: Updated kerberos service name patch