Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uhCx2-00BjUz-Uq for pgsql-docs@arkaria.postgresql.org; Wed, 30 Jul 2025 19:59:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uhCx1-00CYaq-Uu for pgsql-docs@arkaria.postgresql.org; Wed, 30 Jul 2025 19:59:00 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uhCx1-00CYai-JC for pgsql-docs@lists.postgresql.org; Wed, 30 Jul 2025 19:59:00 +0000 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uhCwv-001btG-09 for pgsql-docs@lists.postgresql.org; Wed, 30 Jul 2025 19:58:58 +0000 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-23fe9a5e5e8so2195395ad.0 for ; Wed, 30 Jul 2025 12:58:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20230601.gappssmtp.com; s=20230601; t=1753905532; x=1754510332; darn=lists.postgresql.org; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=hXg/ai6CdqFUGSUcFoimvEI7AMb2Il0DCwf/TP6SQoY=; b=r2/3pMkeFvxE/br6AlX+uIOzNbeg7TWkP+VAUCNV2oJKEP7zqsHlFo6CscTXrTBqyj qb6CBl47TSBpExbFkyJSfXslkWpgo5lDEw9o3T1vZrzUPy7kd7fHWtb2odvZv8irOr0d 6lEQKmMbjySA+qOvzF5RGjZvad4KCc805RiX2u7vo6bjaRBTzjvCKO4+jOemZqhXDux4 3oa9yzj1nTNcAI04rQqm3uiEgzQCW6NgCND8n31j5tNE1DiD2nBSJZgKbrr3aRViUmd+ hClHLMrD/3xx8YIC+tfdb+U0baB2nyvXru2UyISHRqRmm7egXFjBw5PSiKQjtLiNgTyj iy6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753905532; x=1754510332; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=hXg/ai6CdqFUGSUcFoimvEI7AMb2Il0DCwf/TP6SQoY=; b=kgnpQX1SdGaTceZVQdAyihmYHF9/7zshZQv8ia8YjhUMc0x4uXgqK2u836C8ljFHn+ wTDK+7SvATQJ9EuA/cn8FJ9/5LS5o8VXrVbdPRGOKZoDt/5Biy8Gwm5fof1rWd2+TTGi LJARqe2czRUr9eBm7a4GAocm28Rfl3VQO+eEM/2+LlFSlNS62AGcUexldGKYIxfBaVx+ bL9NQoQPtk/ny88JCtZ2wVg1rBkS1irX2KFk2m9PLImaDDFfyVx+7iX+hkXHnCV9kILR iJ6aAWkZwQd3oLZNTmAZ09uUgWFeTWY5t3sdljg3uEunFmxP/o5ffjVowgtKWP0AepMr P+eA== X-Gm-Message-State: AOJu0YzYwX/F2KOAIOGI+00OgbqtYOz9DiPO+nHvWI5WaSZpZUVFIhsM QHQIJ53puCEituofNxzTEyWLBbMhRuFKTejpet3Kr7clKnY2Bl1LPYuiL3xE+jiBLw== X-Gm-Gg: ASbGncuUeFo0g2zXLzo1l1v1o4DyzRa64miSJFYyi0bUfr3mz/NNdd/higWNKpqCe5p v0kHDBOtuC6Kc+KP2o4wJut9+SDdqspnOStr6L+dx/Vi7jSgZOZvGnqD64FWXFShI3hkPKyFSAd 2njEEN0xg/4xkqiHhbUlFGRHO8y9wEX0xGiRA7oENxy/j/iGG2jI41X76gtR6jZSVyHHSAxxtwD QqixcWD4PNQOp0jFSZ2ouAo1DTKIshPljnSFfrV/dBMgotXC5z6m0xt68uqtnWjLImqIU69/+53 aCcvu5wir8GSMzKqfX4HYHHMuFQS9tWwCxfJiYgc17g0Y1j/IsjbQGe9WeqbFtww7WMjF5MRM9X u85a5/OYE0UMe9ybISgbXLjPMXMMbidXRXwpiHxTSCM28TIOFBbPKli/H02Di7Ad/ptRn X-Google-Smtp-Source: AGHT+IF/zRCi8TEvSRnmaDhMYYclWahLMc/Stf6xX846Rlz02LViZQL3VJvFA+c9QTKT/Rnd7Ymbkw== X-Received: by 2002:a17:902:f652:b0:235:f70:fd37 with SMTP id d9443c01a7336-24096a928c5mr54452585ad.19.1753905531908; Wed, 30 Jul 2025 12:58:51 -0700 (PDT) Received: from jeff-ws-bridge.lan (c-76-102-242-158.hsd1.ca.comcast.net. [76.102.242.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-240764eeb18sm44970745ad.110.2025.07.30.12.58.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Jul 2025 12:58:51 -0700 (PDT) Message-ID: <9247c1b9531136e15d83511270e8c43bf877c9ca.camel@j-davis.com> Subject: Re: Initcap works differently with different locale providers From: Jeff Davis To: Alexander Korotkov , Oleg Tselebrovskiy Cc: pgsql-docs@lists.postgresql.org Date: Wed, 30 Jul 2025 12:58:50 -0700 In-Reply-To: <0658C8F0-5ED4-4962-A2A3-524B0D899982@gmail.com> References: <804cc10ef95d4d3b298e76b181fd9437@postgrespro.ru> <0658C8F0-5ED4-4962-A2A3-524B0D899982@gmail.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.52.3-0ubuntu1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Mon, 2025-07-28 at 13:20 +0300, Alexander Korotkov wrote: > I can confirm inicap works with libc and libicu as you stated. =C2=A0The > documentation patch looks good to me. =C2=A0I=E2=80=99ve written a commit= message. > =C2=A0The REL_12_STABLE branch is not relevant anymore as it=E2=80=99s ou= t of > support. =C2=A0I=E2=80=99m going to push this if no objections. Apologies for the late review. First, it doesn't mention the "builtin" provider, which uses the same word break rules as libc. Second, word boundaries can be complex, and I'm wondering if we should not be so precise about what ICU does or doesn't do. For instance, ICU has options like U_TITLECASE_ADJUST_TO_CASED, U_TITLECASE_NO_BREAK_ADJUSTMENT, etc.[1], and I'm not sure exactly which one of those we use. I'd prefer that we try to explain that INITCAP() is intended for convenient display, and the specific result should not be relied upon (at least for ICU; maybe for all providers). If you want specific word boundary rules, write your own function. Regards, Jeff Davis [1] https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/stringoptions_8h.ht= ml#a4975f537b9960f0330b233061ef0608d