aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-02-01 06:27:48 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-02-01 06:27:48 +0000
commitf27976c85b1fb9002727cce65b9f9567e158f754 (patch)
treea9f1424789b87795a21f0ae3453f49915c274681 /src
parent08b0e605636d52bb8b2168dded694fe86f1acbea (diff)
downloadpostgresql-f27976c85b1fb9002727cce65b9f9567e158f754.tar.gz
postgresql-f27976c85b1fb9002727cce65b9f9567e158f754.zip
Make length() disregard trailing spaces in char(n) values, per discussion
some time ago and recent patch from Gavin Sherry. Update documentation to point out that trailing spaces are insignificant in char(n).
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/varchar.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index 2c10ca1485a..6b26a91192c 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.103 2003/11/29 19:51:59 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.104 2004/02/01 06:27:48 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -510,14 +510,16 @@ Datum
bpcharlen(PG_FUNCTION_ARGS)
{
BpChar *arg = PG_GETARG_BPCHAR_P(0);
+ int len;
- /* optimization for single byte encoding */
- if (pg_database_encoding_max_length() <= 1)
- PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
+ /* get number of bytes, ignoring trailing spaces */
+ len = bcTruelen(arg);
+
+ /* in multibyte encoding, convert to number of characters */
+ if (pg_database_encoding_max_length() != 1)
+ len = pg_mbstrlen_with_len(VARDATA(arg), len);
- PG_RETURN_INT32(
- pg_mbstrlen_with_len(VARDATA(arg), VARSIZE(arg) - VARHDRSZ)
- );
+ PG_RETURN_INT32(len);
}
Datum