From ed4d2803aa32add7c05726286b94e78e49bb1257 Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Wed, 12 Mar 2025 11:56:59 -0700
Subject: [PATCH vtmp] fastpath

---
 src/common/unicode_case.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/common/unicode_case.c b/src/common/unicode_case.c
index 2b3b4cdc2e7..b1fc1651043 100644
--- a/src/common/unicode_case.c
+++ b/src/common/unicode_case.c
@@ -390,11 +390,41 @@ casemap(pg_wchar u1, CaseKind casekind, bool full,
 {
 	const pg_case_map *map;
 
+	/*
+	 * Fast path for early codepoints. The only interesting characters are
+	 * [a-zA-Z].
+	 */
 	if (u1 < 0x80)
 	{
-		*simple = case_map[u1].simplemap[casekind];
+		/* fast-path codepoints do not have special casing */
+		Assert(find_case_map(u1)->special_case == NULL);
 
-		return CASEMAP_SIMPLE;
+		switch (casekind)
+		{
+			case CaseLower:
+			case CaseFold:
+				if (u1 >= 'A' && u1 <= 'Z')
+				{
+					*simple = u1 + 0x20;
+					Assert(case_map[u1].simplemap[casekind] == *simple);
+					return CASEMAP_SIMPLE;
+				}
+				break;
+			case CaseTitle:
+			case CaseUpper:
+				if (u1 >= 'a' && u1 <= 'z')
+				{
+					*simple = u1 - 0x20;
+					Assert(case_map[u1].simplemap[casekind] == *simple);
+					return CASEMAP_SIMPLE;
+				}
+				break;
+			default:
+				Assert(false);
+		}
+
+		Assert(case_map[u1].simplemap[casekind] == u1);
+		return CASEMAP_SELF;
 	}
 
 	map = find_case_map(u1);
-- 
2.34.1

