From bcbe4b1bbce253279e0d55aef2f6160936c7409a Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Mon, 6 Jul 2026 10:27:57 -0700
Subject: [PATCH v1 1/4] Fix unintentional behavior change from 5a38104b36.

Reported-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/20260630012919.78@rfd.leadboat.com
Backpatch-through: 19
---
 src/backend/utils/adt/like.c               | 6 ++++--
 src/test/regress/expected/collate.utf8.out | 7 +++++++
 src/test/regress/sql/collate.utf8.sql      | 3 +++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/backend/utils/adt/like.c b/src/backend/utils/adt/like.c
index 350bc07f210..64147bc5b5c 100644
--- a/src/backend/utils/adt/like.c
+++ b/src/backend/utils/adt/like.c
@@ -191,12 +191,14 @@ Generic_Text_IC_like(text *str, text *pat, Oid collation)
 
 	/*
 	 * For efficiency reasons, in the C locale we don't call lower() on the
-	 * pattern and text, but instead lowercase each character lazily.
+	 * pattern and text, but instead lowercase each character lazily. This
+	 * only works for single-byte encodings, otherwise "_" may incorrectly
+	 * match an incomplete byte sequence.
 	 *
 	 * XXX: use casefolding instead?
 	 */
 
-	if (locale->ctype_is_c)
+	if (locale->ctype_is_c && pg_database_encoding_max_length() == 1)
 	{
 		p = VARDATA_ANY(pat);
 		plen = VARSIZE_ANY_EXHDR(pat);
diff --git a/src/test/regress/expected/collate.utf8.out b/src/test/regress/expected/collate.utf8.out
index 0c3ab5c89b2..72606180e99 100644
--- a/src/test/regress/expected/collate.utf8.out
+++ b/src/test/regress/expected/collate.utf8.out
@@ -34,6 +34,13 @@ SELECT U&'\00C1\00E1' !~ '[[:alpha:]]' COLLATE regress_builtin_c;
 (1 row)
 
 DROP COLLATION regress_builtin_c;
+-- a '_' matches a multibyte character
+SELECT 'café' ILIKE 'caf_' COLLATE "C";
+ ?column? 
+----------
+ t
+(1 row)
+
 --
 -- Test PG_C_UTF8
 --
diff --git a/src/test/regress/sql/collate.utf8.sql b/src/test/regress/sql/collate.utf8.sql
index d6d14220ab3..ad05f7ac15f 100644
--- a/src/test/regress/sql/collate.utf8.sql
+++ b/src/test/regress/sql/collate.utf8.sql
@@ -26,6 +26,9 @@ SELECT U&'\00C1\00E1' !~ '[[:alpha:]]' COLLATE regress_builtin_c;
 
 DROP COLLATION regress_builtin_c;
 
+-- a '_' matches a multibyte character
+SELECT 'café' ILIKE 'caf_' COLLATE "C";
+
 --
 -- Test PG_C_UTF8
 --
-- 
2.43.0

