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
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 |
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 |