From 226211f0af3b9deee6733a5393f32cb34c59bc53 Mon Sep 17 00:00:00 2001
From: Tatsuo Ishii <ishii@postgresql.org>
Date: Sun, 18 Nov 2001 12:07:07 +0000
Subject: [PATCH] Optimization for bpcharlen, textlen, varcharlen in case of
 single byte encodings.

---
 src/backend/utils/adt/varchar.c | 10 +++++++++-
 src/backend/utils/adt/varlena.c | 25 ++++++++-----------------
 2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index b7230b5bbd9..f25a06e1449 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 7b15cfa690f..a6600a22545 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;
-
-	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);
+	/* optimization for single byte encoding */
+	if (pg_database_encoding_max_length() <= 1)
+		PG_RETURN_INT32(VARSIZE(t) - VARHDRSZ);
+
+	PG_RETURN_INT32(
+		pg_mbstrlen_with_len(VARDATA(t), VARSIZE(t) - VARHDRSZ)
+		);
 #else
 	PG_RETURN_INT32(VARSIZE(t) - VARHDRSZ);
 #endif
-- 
GitLab