diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index b7230b5bbd..f25a06e144 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.86 2001/11/08 04:05:13 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.87 2001/11/18 12:07:07 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -598,6 +598,10 @@ bpcharlen(PG_FUNCTION_ARGS) BpChar *arg = PG_GETARG_BPCHAR_P(0); #ifdef MULTIBYTE + /* optimization for single byte encoding */ + if (pg_database_encoding_max_length() <= 1) + PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ); + PG_RETURN_INT32( pg_mbstrlen_with_len(VARDATA(arg), VARSIZE(arg) - VARHDRSZ) ); @@ -806,6 +810,10 @@ varcharlen(PG_FUNCTION_ARGS) VarChar *arg = PG_GETARG_VARCHAR_P(0); #ifdef MULTIBYTE + /* optimization for single byte encoding */ + if (pg_database_encoding_max_length() <= 1) + PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ); + PG_RETURN_INT32( pg_mbstrlen_with_len(VARDATA(arg), VARSIZE(arg) - VARHDRSZ) ); diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 7b15cfa690..a6600a2254 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.74 2001/10/25 05:49:46 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.75 2001/11/18 12:07:07 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -240,22 +240,13 @@ textlen(PG_FUNCTION_ARGS) text *t = PG_GETARG_TEXT_P(0); #ifdef MULTIBYTE - unsigned char *s; - int len, - l, - wl; + /* optimization for single byte encoding */ + if (pg_database_encoding_max_length() <= 1) + PG_RETURN_INT32(VARSIZE(t) - VARHDRSZ); - len = 0; - s = VARDATA(t); - l = VARSIZE(t) - VARHDRSZ; - while (l > 0) - { - wl = pg_mblen(s); - l -= wl; - s += wl; - len++; - } - PG_RETURN_INT32(len); + PG_RETURN_INT32( + pg_mbstrlen_with_len(VARDATA(t), VARSIZE(t) - VARHDRSZ) + ); #else PG_RETURN_INT32(VARSIZE(t) - VARHDRSZ); #endif