Re: character type value is not padded with spaces - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: character type value is not padded with spaces |
Date | |
Msg-id | 200506042056.j54KukW00526@candle.pha.pa.us Whole thread Raw |
In response to | character type value is not padded with spaces (Yoshiyuki Asaba <y-asaba@sra.co.jp>) |
List | 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@sra.co.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@postgresql.org) -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: