From f5dff44736911b10c83d2717ca53ad90dd967758 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 25 Feb 2002 04:06:52 +0000
Subject: [PATCH] I've attached a simple patch which should improve the
 performance of hashname() and reduce the penalty incured when NAMEDATALEN is
 increased. I posted this to -hackers a couple days ago, and there haven't
 been any major complaints. It passes the regression tests. See -hackers for
 more discussion, as well as the suggestion from Tom Lane on which this patch
 is based.

Unless anyone sees any problems, please apply for 7.3.

Cheers,

Neil Conway
---
 src/backend/access/hash/hashfunc.c |  8 ++++----
 src/backend/utils/cache/catcache.c | 22 ++--------------------
 src/include/access/hash.h          |  4 ++--
 3 files changed, 8 insertions(+), 26 deletions(-)

diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c
index 4cb157c702c..9cb2a02cf3a 100644
--- a/src/backend/access/hash/hashfunc.c
+++ b/src/backend/access/hash/hashfunc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.30 2001/03/22 03:59:13 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.31 2002/02/25 04:06:47 momjian Exp $
  *
  * NOTES
  *	  These functions are stored in pg_amproc.	For each operator class
@@ -95,7 +95,7 @@ hashname(PG_FUNCTION_ARGS)
 {
 	char	   *key = NameStr(*PG_GETARG_NAME(0));
 
-	return hash_any((char *) key, NAMEDATALEN);
+	return hash_any(key, strlen(key));
 }
 
 /*
@@ -125,7 +125,7 @@ hashvarlena(PG_FUNCTION_ARGS)
  *
  * (Comment from the original db3 hashing code: )
  *
- * "This is INCREDIBLY ugly, but fast.  We break the string up into 8 byte
+ * This is INCREDIBLY ugly, but fast.  We break the string up into 8 byte
  * units.  On the first time through the loop we get the 'leftover bytes'
  * (strlen % 8).  On every later iteration, we perform 8 HASHC's so we handle
  * all 8 bytes.  Essentially, this saves us 7 cmp & branch instructions.  If
@@ -134,7 +134,7 @@ hashvarlena(PG_FUNCTION_ARGS)
  * "OZ's original sdbm hash"
  */
 Datum
-hash_any(char *keydata, int keylen)
+hash_any(const char *keydata, int keylen)
 {
 	uint32		n;
 	int			loop;
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 47ab410cfc2..4339f51f3d7 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.87 2002/02/19 20:11:17 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.88 2002/02/25 04:06:50 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -97,7 +97,6 @@ static Index CatalogCacheComputeHashIndex(CatCache *cache,
 static Index CatalogCacheComputeTupleHashIndex(CatCache *cache,
 								  HeapTuple tuple);
 static void CatalogCacheInitializeCache(CatCache *cache);
-static Datum cc_hashname(PG_FUNCTION_ARGS);
 #ifdef CATCACHE_STATS
 static void CatCachePrintStats(void);
 #endif
@@ -116,7 +115,7 @@ GetCCHashFunc(Oid keytype)
 		case CHAROID:
 			return hashchar;
 		case NAMEOID:
-			return cc_hashname;
+			return hashname;
 		case INT2OID:
 			return hashint2;
 		case INT2VECTOROID:
@@ -137,23 +136,6 @@ GetCCHashFunc(Oid keytype)
 	}
 }
 
-static Datum
-cc_hashname(PG_FUNCTION_ARGS)
-{
-	/*
-	 * We need our own variant of hashname because we want to accept
-	 * null-terminated C strings as search values for name fields. So, we
-	 * have to make sure the data is correctly padded before we compute
-	 * the hash value.
-	 */
-	NameData	my_n;
-
-	namestrcpy(&my_n, NameStr(*PG_GETARG_NAME(0)));
-
-	return DirectFunctionCall1(hashname, NameGetDatum(&my_n));
-}
-
-
 #ifdef CATCACHE_STATS
 
 static void
diff --git a/src/include/access/hash.h b/src/include/access/hash.h
index 835d778d904..c88f34f54a9 100644
--- a/src/include/access/hash.h
+++ b/src/include/access/hash.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: hash.h,v 1.42 2001/11/05 17:46:31 momjian Exp $
+ * $Id: hash.h,v 1.43 2002/02/25 04:06:52 momjian Exp $
  *
  * NOTES
  *		modeled after Margo Seltzer's hash implementation for unix.
@@ -265,7 +265,7 @@ extern Datum hashoidvector(PG_FUNCTION_ARGS);
 extern Datum hashint2vector(PG_FUNCTION_ARGS);
 extern Datum hashname(PG_FUNCTION_ARGS);
 extern Datum hashvarlena(PG_FUNCTION_ARGS);
-extern Datum hash_any(char *keydata, int keylen);
+extern Datum hash_any(const char *keydata, int keylen);
 
 
 /* private routines */
-- 
GitLab