Change collation cache to use simplehash.h.
authorJeff Davis <jdavis@postgresql.org>
Sun, 28 Jul 2024 19:39:57 +0000 (12:39 -0700)
committerJeff Davis <jdavis@postgresql.org>
Sun, 28 Jul 2024 19:39:57 +0000 (12:39 -0700)
Speeds up text comparison expressions when using a collation other
than the database default collation. Does not affect larger operations
such as ORDER BY, because the lookup is only done once.

Discussion: https://postgr.es/m/7bb9f018d20a7b30b9a7f6231efab1b5e50c7720.camel@j-davis.com
Reviewed-by: John Naylor, Andreas Karlsson
src/backend/utils/adt/pg_locale.c

index 38c40a40489767cbc5682e1b2ccbad00d5067ecf..f386945ee0c487fcbdff225964612eb9722e4784 100644 (file)
 
 #include "access/htup_details.h"
 #include "catalog/pg_collation.h"
+#include "common/hashfn.h"
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "utils/builtins.h"
 #include "utils/formatting.h"
 #include "utils/guc_hooks.h"
-#include "utils/hsearch.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
 #include "utils/pg_locale.h"
@@ -129,10 +129,27 @@ typedef struct
        bool            ctype_is_c;             /* is collation's LC_CTYPE C? */
        bool            flags_valid;    /* true if above flags are valid */
        pg_locale_t locale;                     /* locale_t struct, or 0 if not valid */
-} collation_cache_entry;
 
-static HTAB *collation_cache = NULL;
+       /* needed for simplehash */
+       uint32          hash;
+       char            status;
+} collation_cache_entry;
 
+#define SH_PREFIX              collation_cache
+#define SH_ELEMENT_TYPE        collation_cache_entry
+#define SH_KEY_TYPE            Oid
+#define SH_KEY                 collid
+#define SH_HASH_KEY(tb, key)           murmurhash32((uint32) key)
+#define SH_EQUAL(tb, a, b)             (a == b)
+#define SH_GET_HASH(tb, a)             a->hash
+#define SH_SCOPE               static inline
+#define SH_STORE_HASH
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+static MemoryContext CollationCacheContext = NULL;
+static collation_cache_hash *CollationCache = NULL;
 
 #if defined(WIN32) && defined(LC_MESSAGES)
 static char *IsoLocaleName(const char *);
@@ -1235,18 +1252,16 @@ lookup_collation_cache(Oid collation, bool set_flags)
        Assert(OidIsValid(collation));
        Assert(collation != DEFAULT_COLLATION_OID);
 
-       if (collation_cache == NULL)
+       if (CollationCache == NULL)
        {
-               /* First time through, initialize the hash table */
-               HASHCTL         ctl;
-
-               ctl.keysize = sizeof(Oid);
-               ctl.entrysize = sizeof(collation_cache_entry);
-               collation_cache = hash_create("Collation cache", 100, &ctl,
-                                                                         HASH_ELEM | HASH_BLOBS);
+               CollationCacheContext = AllocSetContextCreate(TopMemoryContext,
+                                                                                                         "collation cache",
+                                                                                                         ALLOCSET_DEFAULT_SIZES);
+               CollationCache = collation_cache_create(
+                       CollationCacheContext, 16, NULL);
        }
 
-       cache_entry = hash_search(collation_cache, &collation, HASH_ENTER, &found);
+       cache_entry = collation_cache_insert(CollationCache, collation, &found);
        if (!found)
        {
                /*