v1-0001-Fix-unintentional-behavior-change-from-5a38104b36.patch
text/x-patch
Filename: v1-0001-Fix-unintentional-behavior-change-from-5a38104b36.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Fix unintentional behavior change from 5a38104b36.
| File | + | − |
|---|---|---|
| src/backend/utils/adt/like.c | 4 | 2 |
| src/test/regress/expected/collate.utf8.out | 7 | 0 |
| src/test/regress/sql/collate.utf8.sql | 3 | 0 |
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