From 5ba89f4bdfc6b1056d6e7b78a5577c711cebd0af Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Sun, 19 Nov 2023 14:00:23 -0800
Subject: [PATCH v3 4/5] GUC: optimize for already case-folded names.

---
 src/backend/utils/misc/guc.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 5e3b95e3f2..bcadbface6 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1310,17 +1310,24 @@ find_option(const char *name, bool create_placeholders, bool skip_errors,
 {
 	GUCHashEntry *hentry;
 	int			i;
-	char *name_key;
 
 	Assert(name);
 
-	/* Look it up using the hash table. */
-	name_key = guc_name_key(elevel, name);
-	if (name_key == NULL)
-		return NULL;
-	hentry = GUCHash_lookup(guc_hashtab, name_key);
-	guc_free(name_key);
-	name_key = NULL;
+	/*
+	 * Look it up using the hash table without case-folding first, as an
+	 * optimization.
+	 */
+	hentry = GUCHash_lookup(guc_hashtab, name);
+
+	/* Try again with case folding. */
+	if (!hentry)
+	{
+		char *name_key = guc_name_key(elevel, name);
+		if (name_key == NULL)
+			return NULL;
+		hentry = GUCHash_lookup(guc_hashtab, name_key);
+		guc_free(name_key);
+	}
 
 	if (hentry)
 		return hentry->gucvar;
-- 
2.34.1

