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.96) (envelope-from ) id 1vQUX7-008ySL-1D for pgsql-bugs@arkaria.postgresql.org; Tue, 02 Dec 2025 17:51:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vQUX6-009Kdp-1O for pgsql-bugs@arkaria.postgresql.org; Tue, 02 Dec 2025 17:51:24 +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.96) (envelope-from ) id 1vQUX5-009Kdg-2k for pgsql-bugs@lists.postgresql.org; Tue, 02 Dec 2025 17:51:24 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vQUWy-002mry-1F for pgsql-bugs@lists.postgresql.org; Tue, 02 Dec 2025 17:51:22 +0000 Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-640b0639dabso10363283a12.3 for ; Tue, 02 Dec 2025 09:51:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec.at; s=google; t=1764697876; x=1765302676; darn=lists.postgresql.org; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:from:to:cc:subject:date:message-id:reply-to; bh=HMZNmlHv4bCkq/evojKkqgi2k5V6gE4N7aOV+tHqkv0=; b=qzem9/sxaxIJpzhMTg1sMCwlGf6nIzY4rlvN633Wkacnk39C202ValVRGLzhseaamJ PYwZeJazgnJ/Z3dIP/GkXkhhZyvaDUPsJxgcaDXuQ9BFP7cSCGl9FyXDR/t5YrSB3mZs SR4i/VNGYt2WutYZtXXaJSDod7bwf+/7E+HGBQ0L72/rbWcY0DfUUeR/ToA3roAA8DPc mPy3NQEtRfgP6/GQ11zrfle9GHxbBvw+dFo6bXfMelZpA0gfgrptkRQ5QtSAlMJhuHAD 2e8mJlza0cbnpyNocUJRiYhUfNcNnxK5JcYXFVF2YD4aWubQerIO1PsJndvPCdyoZHJZ FnnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764697876; x=1765302676; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=HMZNmlHv4bCkq/evojKkqgi2k5V6gE4N7aOV+tHqkv0=; b=BMRxZoG5Ki4WQ57xIOjQOKOHB3UydJyqxbX0MiVfjjWhA0rveIdyWBb7kVo4rSE8KP dRidrR9q/aReSFN9JPgPmDRqdfhEkeC/t6d7y2VP14ibWFIXyekibU3qGm7POGtrEhZv 0aWsbtIcFbdr2EdI7E8dzsUPlaKagVtExrVw7tVfvN6eE2Qygc3dfIdmI4aJt7voFKs9 4MPAB7uMWD6PltLfSnRCOmQ0d3Yx3A9dvKn0yqok4RUKNrXX3fCr50c8pxdbQowvRBE5 mhVetAFkHoytXh6LTTsr7N/uhBy70Vp09bmQzu9UFnBTNrmUcfrhjF3XEeErzBslyMuZ TaWw== X-Forwarded-Encrypted: i=1; AJvYcCW4HnaFDknKMwjiuIaL26egxFu3GYAuMHJz535uwPy3k+XNAgdrHVmZnJh1SkGiPI29WYZSSAbOjwMY@lists.postgresql.org X-Gm-Message-State: AOJu0Yxi5IGuMWzpVA0Cy5rq8DrPkG11HOFtipUoZ45o5wBVk3IoB9Uj FnWEEA8w0Yu4+/2beYXXNzSleQdNX97r38lliaCFi3CE7Tb44PpRta4UmNd9d2mHpkJrTOEzhco BkOrrI80hgA== X-Gm-Gg: ASbGncs6X2pbjwI+ZCfmc+c6m7Ocqf6Fu4wTopMiWVVsw42k7ary/3xboZVesICnLZB KfnYVAWS7mbUBM1q+Ez8v4rdxCHjCdoIa7WL8y8nxGo+RX6cybbY5OdquOJcZ71IYxF0ydhLyh0 kg403U8fEbty5twuBe+b8L006rENGJrhiiQUSpz+uiLqO5r3mT09jZbep/g7KjxsqOvMG4kheIz SO61ldHd2gD8tKB6byDf3gHSu1OaxPrWILvS94qg8yQYWt2tX6NiCp+Q8XleRDm8NfH+QzXE/Yk EdZuysywLsvQFbnyweVDfyB8hUMkYPmL6vBWy/PbgXa3KmhJJvfiaxK4areSM6k7spphvDYSvTt /jxz7RW6i1XquM1+lP1QY73HN0uC51p3wmC7AEKVcE6RFTRWgeB2bjpiYQFKiaXs/FGKPWfpLQb sOIJyJYNJT6759nmAgvFi2Nj/PA4TlDydCIFLTRVm/ X-Google-Smtp-Source: AGHT+IHMaF1ouoHOqpv1fldCkmZEWIbNR69Q+asIsSUmeg1ABKruFVr4Ci6Kz+PmALmIhFMl5OILag== X-Received: by 2002:a05:6402:5244:b0:640:f2cd:831 with SMTP id 4fb4d7f45d1cf-6455443f4bemr41952166a12.10.1764697875574; Tue, 02 Dec 2025 09:51:15 -0800 (PST) Received: from laurenz.albe-K4N0CV00F97414D ([2001:871:70:4d50:82d5:e2a3:8d7d:8548]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-64750a6ea6esm16355608a12.6.2025.12.02.09.51.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Dec 2025 09:51:15 -0800 (PST) Message-ID: <464a14fcbee9567ace136716714b8c18f9bd87fb.camel@cybertec.at> Subject: Re: BUG #19341: REPLACE() fails to match final character when using nondeterministic ICU collation From: Laurenz Albe To: Tom Lane Cc: Heikki Linnakangas , adam.warland@infor.com, pgsql-bugs@lists.postgresql.org Date: Tue, 02 Dec 2025 18:51:14 +0100 In-Reply-To: <375807.1764696352@sss.pgh.pa.us> References: <19341-1d9a22915edfec58@postgresql.org> <60b467ac47d5c6bbb9c21c3bdfecce8e5de60cda.camel@cybertec.at> <6935ea1e-cfb1-400b-9057-3d43b55d621a@iki.fi> <9f47c6b24d6cf59002603caf19b8b3f4854176be.camel@cybertec.at> <375807.1764696352@sss.pgh.pa.us> Content-Type: multipart/mixed; boundary="=-E8vSkERV/qAhr9y48Fjx" User-Agent: Evolution 3.56.2 (3.56.2-2.fc42) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-E8vSkERV/qAhr9y48Fjx Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, 2025-12-02 at 12:25 -0500, Tom Lane wrote: > Laurenz Albe writes: > > > > for (const char *test_end =3D hptr; test_end <=3D haystack_end; tes= t_end +=3D pg_mblen(test_end)) >=20 > > During the last iteration of the loop, "test_end" will be equal to "hay= stack_end", > > and the loop increment will call "pg_mblen(test_end)". >=20 > Right, clearly unsafe (and I bet valgrind would complain about it). > You need to rearrange the loop logic so that we won't attempt to > increment test_end that last time through. Perhaps a for-loop > isn't the best way to write it. Right. The attached patch v3 turns it into a while loop to avoid the problem. Yours, Laurenz Albe --=-E8vSkERV/qAhr9y48Fjx Content-Disposition: attachment; filename*0=v3-0001-Fix-greedy-substring-search-for-non-deterministic.pat; filename*1=ch Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="v3-0001-Fix-greedy-substring-search-for-non-deterministic.patch"; charset="UTF-8" RnJvbSA0MWM0NDFhMDJkYjM0MTk1Mjc2M2QwNGJiODIyYTYzNGI3MTFjNzM1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5h dD4KRGF0ZTogVHVlLCAyIERlYyAyMDI1IDE4OjQ5OjExICswMTAwClN1YmplY3Q6IFtQQVRDSCB2 M10gRml4IGdyZWVkeSBzdWJzdHJpbmcgc2VhcmNoIGZvciBub24tZGV0ZXJtaW5pc3RpYwogY29s bGF0aW9ucwoKRHVlIHRvIGFuIG9mZi1ieS1vbmUgZXJyb3IsIHRoZSBjb2RlIGZhaWxlZCB0byBm aW5kIG1hdGNoZXMgYXQgdGhlCmVuZCBvZiB0aGUgaGF5c3RhY2suCgpBdXRob3I6IExhdXJlbnog QWxiZSA8bGF1cmVuei5hbGJlQGN5YmVydGVjLmF0PgpSZXBvcnRlZC1CeTogQWRhbSBXYXJsYW5k IDxhZGFtLndhcmxhbmRAaW5mb3IuY29tPgpSZXZpZXdlZC1CeTogSGVpa2tpIExpbm5ha2FuZ2Fz IDxobGlubmFrYUBpa2kuZmk+ClJldmlld2VkLUJ5OiBUb20gTGFuZSA8dGdsQHNzcy5wZ2gucGEu dXM+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vMTkzNDEtMWQ5YTIyOTE1ZWRmZWM1 OCU0MHBvc3RncmVzcWwub3JnCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3ZhcmxlbmEuYyAg ICAgICAgICAgICAgICB8IDkgKysrKysrKystCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Nv bGxhdGUuaWN1LnV0Zjgub3V0IHwgNyArKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xs YXRlLmljdS51dGY4LnNxbCAgICAgIHwgMyArKysKIDMgZmlsZXMgY2hhbmdlZCwgMTggaW5zZXJ0 aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC92YXJsZW5hLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvdmFybGVuYS5jCmluZGV4IDM4OTQ0 NTdhYjQwLi45OWQxYmYwOWYyMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Zh cmxlbmEuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvdmFybGVuYS5jCkBAIC0xMTM2LDYg KzExMzYsOCBAQCB0ZXh0X3Bvc2l0aW9uX25leHRfaW50ZXJuYWwoY2hhciAqc3RhcnRfcHRyLCBU ZXh0UG9zaXRpb25TdGF0ZSAqc3RhdGUpCiAJCWhwdHIgPSBzdGFydF9wdHI7CiAJCXdoaWxlICho cHRyIDwgaGF5c3RhY2tfZW5kKQogCQl7CisJCQljb25zdCBjaGFyICp0ZXN0X2VuZDsKKwogCQkJ LyoKIAkJCSAqIEZpcnN0IGNoZWNrIHRoZSBjb21tb24gY2FzZSB0aGF0IHRoZXJlIGlzIGEgbWF0 Y2ggaW4gdGhlCiAJCQkgKiBoYXlzdGFjayBvZiBleGFjdGx5IHRoZSBsZW5ndGggb2YgdGhlIG5l ZWRsZS4KQEAgLTExNDksNyArMTE1MSw4IEBAIHRleHRfcG9zaXRpb25fbmV4dF9pbnRlcm5hbChj aGFyICpzdGFydF9wdHIsIFRleHRQb3NpdGlvblN0YXRlICpzdGF0ZSkKIAkJCSAqIEVsc2UgY2hl Y2sgaWYgYW55IG9mIHRoZSBwb3NzaWJsZSBzdWJzdHJpbmdzIHN0YXJ0aW5nIGF0IGhwdHIKIAkJ CSAqIGFyZSBlcXVhbCB0byB0aGUgbmVlZGxlLgogCQkJICovCi0JCQlmb3IgKGNvbnN0IGNoYXIg KnRlc3RfZW5kID0gaHB0cjsgdGVzdF9lbmQgPCBoYXlzdGFja19lbmQ7IHRlc3RfZW5kICs9IHBn X21ibGVuKHRlc3RfZW5kKSkKKwkJCXRlc3RfZW5kID0gaHB0cjsKKwkJCXdoaWxlICh0ZXN0X2Vu ZCA8PSBoYXlzdGFja19lbmQpCiAJCQl7CiAJCQkJaWYgKHBnX3N0cm5jb2xsKGhwdHIsICh0ZXN0 X2VuZCAtIGhwdHIpLCBuZWVkbGUsIG5lZWRsZV9sZW4sIHN0YXRlLT5sb2NhbGUpID09IDApCiAJ CQkJewpAQCAtMTE1OCw2ICsxMTYxLDEwIEBAIHRleHRfcG9zaXRpb25fbmV4dF9pbnRlcm5hbChj aGFyICpzdGFydF9wdHIsIFRleHRQb3NpdGlvblN0YXRlICpzdGF0ZSkKIAkJCQkJaWYgKCFzdGF0 ZS0+Z3JlZWR5KQogCQkJCQkJYnJlYWs7CiAJCQkJfQorCisJCQkJaWYgKHRlc3RfZW5kID09IGhh eXN0YWNrX2VuZCkKKwkJCQkJYnJlYWs7CisJCQkJdGVzdF9lbmQgKz0gcGdfbWJsZW4odGVzdF9l bmQpOwogCQkJfQogCQkJaWYgKHJlc3VsdF9ocHRyKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51dGY4Lm91dCBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQKaW5kZXggYjg1NzlhMWVmYzYu LjBhMTRjMWQ5M2ZmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvbGxh dGUuaWN1LnV0Zjgub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5p Y3UudXRmOC5vdXQKQEAgLTE0ODQsNiArMTQ4NCwxMyBAQCBTRUxFQ1QgYXJyYXlfc29ydCgne2Es Qn0nOjp0ZXh0W10gQ09MTEFURSAiQyIpOwogIHtCLGF9CiAoMSByb3cpCiAKKy0tIHRlc3QgcmVw bGFjZSgpIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoYnVnICMxOTM0MSkKK1NFTEVDVCByZXBs YWNlKCd0ZXN0WCcgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlLCAneCcgQ09MTEFURSBjYXNlX2lu c2Vuc2l0aXZlLCAnZXMnKTsKKyByZXBsYWNlIAorLS0tLS0tLS0tCisgdGVzdGVzCisoMSByb3cp CisKIC0tIHRlc3QgbGFuZ3VhZ2UgdGFncwogQ1JFQVRFIENPTExBVElPTiBsdF9pbnNlbnNpdGl2 ZSAocHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICdlbi11LWtzLWxldmVsMScsIGRldGVybWluaXN0 aWMgPSBmYWxzZSk7CiBTRUxFQ1QgJ2FCY0QnIENPTExBVEUgbHRfaW5zZW5zaXRpdmUgPSAnQWJD ZCcgQ09MTEFURSBsdF9pbnNlbnNpdGl2ZTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2NvbGxhdGUuaWN1LnV0Zjguc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5p Y3UudXRmOC5zcWwKaW5kZXggNmY1YWJhYzBkYzAuLjVlM2ZlZjliMzgxIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbApAQCAtNTY4LDYgKzU2OCw5IEBAIFNFTEVD VCAnYWJjJyA8PSAnQUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUsICdhYmMnID49ICdBQkMn IENPTExBVEUgY2FzZV9pbnNlCiBTRUxFQ1QgYXJyYXlfc29ydCgne2EsQn0nOjp0ZXh0W10gQ09M TEFURSBjYXNlX2luc2Vuc2l0aXZlKTsKIFNFTEVDVCBhcnJheV9zb3J0KCd7YSxCfSc6OnRleHRb XSBDT0xMQVRFICJDIik7CiAKKy0tIHRlc3QgcmVwbGFjZSgpIGF0IHRoZSBlbmQgb2YgdGhlIHN0 cmluZyAoYnVnICMxOTM0MSkKK1NFTEVDVCByZXBsYWNlKCd0ZXN0WCcgQ09MTEFURSBjYXNlX2lu c2Vuc2l0aXZlLCAneCcgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlLCAnZXMnKTsKKwogLS0gdGVz dCBsYW5ndWFnZSB0YWdzCiBDUkVBVEUgQ09MTEFUSU9OIGx0X2luc2Vuc2l0aXZlIChwcm92aWRl ciA9IGljdSwgbG9jYWxlID0gJ2VuLXUta3MtbGV2ZWwxJywgZGV0ZXJtaW5pc3RpYyA9IGZhbHNl KTsKIFNFTEVDVCAnYUJjRCcgQ09MTEFURSBsdF9pbnNlbnNpdGl2ZSA9ICdBYkNkJyBDT0xMQVRF IGx0X2luc2Vuc2l0aXZlOwotLSAKMi41Mi4wCgo= --=-E8vSkERV/qAhr9y48Fjx--