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 1tOVSQ-006mia-Hn for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Dec 2024 05:21:51 +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 1tOVRR-005Kdo-Cr for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Dec 2024 05:20:49 +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 1tOVRQ-005Kdf-Ih for pgsql-hackers@lists.postgresql.org; Fri, 20 Dec 2024 05:20:48 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tOVRL-000Uyp-UO for pgsql-hackers@postgresql.org; Fri, 20 Dec 2024 05:20:47 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id E4211A8FF for ; Fri, 20 Dec 2024 06:20:39 +0100 (CET) Received: from s979.loopia.se (unknown [172.22.191.6]) by s807.loopia.se (Postfix) with ESMTP id CA474BC42; Fri, 20 Dec 2024 06:20:39 +0100 (CET) Received: from s898.loopia.se (unknown [172.22.191.6]) by s979.loopia.se (Postfix) with ESMTP id C8A9A10BC432; Fri, 20 Dec 2024 06:20:39 +0100 (CET) X-Virus-Scanned: amavisd-new at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1.2 X-Spam-Level: X-Spam-Status: No, score=-1.2 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1] autolearn=disabled Authentication-Results: s898.loopia.se (amavisd-new); dkim=pass (2048-bit key) header.d=proxel.se Received: from s979.loopia.se ([172.22.191.6]) by s898.loopia.se (s898.loopia.se [172.22.190.17]) (amavisd-new, port 10024) with UTF8LMTP id OtSrU96gsGsW; Fri, 20 Dec 2024 06:20:38 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: andreas@proxel.se X-Loopia-Originating-IP: 147.28.75.140 Received: from [192.168.0.121] (customer-147-28-75-140.stosn.net [147.28.75.140]) (Authenticated sender: andreas@proxel.se) by s979.loopia.se (Postfix) with ESMTPSA id BE28010BC39E; Fri, 20 Dec 2024 06:20:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1734672038; bh=jVjOgs5nHg2S3sCCvxC7SStIkc2/6l6uuUq9SJN5OUU=; h=Date:To:Cc:From:Subject; b=BIZU6Az0saKfa3X02sU7h/wObRK2pmAm0vsVejfzF08O6VIQ4hDOwvTAKiQkSMoim S1jBE9Uj4/Dtb3wutK1dpt6zFVSwn7lJ6CQTYM3u/9Lf/6CY35AR01XHCUGyuaW8YJ +JY0BhvjtmTAvCUu1ZmDSuiK7UuQNanKS6/Md8/NAkOWUtmrbS2kCy/YDFwRPfHkZ5 Ofi/aVGjVGYeMnhOtVrn+J1to0c5DI4erv9VzsYY0Yt6S8G8HVA+SEjf3awRebBcpV e6i5NNYgHqwF+Jl0B/G163dZ8n3b+SvRzratIZ0dWHM6gMW9lW48rLAM4niuNXHINS /Z93LY0T/TnjA== Content-Type: multipart/mixed; boundary="------------u2AuZgzJ0OQSaucCGmAtRqnn" Message-ID: <167986ff-afcf-4542-94c6-61ee8474e138@proxel.se> Date: Fri, 20 Dec 2024 06:20:38 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: pgsql-hackers Cc: Jeff Davis From: Andreas Karlsson Subject: Speed up ICU case conversion by using ucasemap_utf8To*() List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------u2AuZgzJ0OQSaucCGmAtRqnn Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, Jeff pointed out to me that the case conversion functions in ICU have UTF-8 specific versions which means we can call those directly if the database encoding is UTF-8 and skip having to convert to and from UChar. Since most people today run their databases in UTF-8 I think this optimization is worth it and when measuring on short to medium length strings I got a 15-20% speed up. It is still slower than glibc in my benchmarks but the gap is smaller now. SELECT count(upper) FROM (SELECT upper(('Kålhuvud ' || i) COLLATE "sv-SE-x-icu") FROM generate_series(1, 1000000) i); master: ~540 ms Patched: ~460 ms glibc: ~410 ms I have also attached a clean up patch for the non-UTF-8 code paths. I thought about doing the same for the new UTF-8 code paths but it turned out to be a bit messy due to different function signatures for ucasemap_utf8ToUpper() and ucasemap_utf8ToLower() vs ucasemap_utf8ToTitle(). Andreas --------------u2AuZgzJ0OQSaucCGmAtRqnn Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Use-optimized-versions-of-ICU-case-conversion-for.patch" Content-Disposition: attachment; filename*0="v1-0001-Use-optimized-versions-of-ICU-case-conversion-for.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1YTM1NWVmMDgzY2M3ZGU5MmFlMWU1ZGNjMDE5ODg2NmEwNzkxOWViIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogVHVlLCAxNyBEZWMgMjAyNCAyMjo0NzowMCArMDEwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMS8yXSBVc2Ugb3B0aW1pemVkIHZlcnNpb25zIG9mIElDVSBjYXNlIGNvbnZl cnNpb24gZm9yCiBVVEYtOAoKSW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRvIGFuZCBmcm9tIFVD aGFyIHdoZW4gZG9pbmcgY2FzZSBjb252ZXJzaW9ucyB3ZQp1c2UgdGhlIFVURi04IHZlcnNp b25zIG9mIHRoZSBmdW5jdGlvbnMuIFRoaXMgY2FuIGdpdmUgYSBzaWduZmljYW50CnNwZWVk dXAsIDE1LTIwJSwgb24gc2hvcnQgdG8gbWVkaXVtIGxlbmd0aCBzdHJpbmdzLgotLS0KIHNy Yy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1LmMgfCAxNjEgKysrKysrKysrKysr KysrKysrLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMTQgaW5zZXJ0aW9ucygrKSwgNDcg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xv Y2FsZV9pY3UuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1LmMKaW5k ZXggZjBhNzdhNzY3ZTcuLmVlYTZmNDhmNmMzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9w Z19sb2NhbGVfaWN1LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJwb3N0Z3Jlcy5o IgogCiAjaWZkZWYgVVNFX0lDVQorI2luY2x1ZGUgInVuaWNvZGUvdWNhc2VtYXAuaCIKICNp bmNsdWRlIDx1bmljb2RlL3VjbnYuaD4KICNpbmNsdWRlIDx1bmljb2RlL3VzdHJpbmcuaD4K IApAQCAtMTAwLDkgKzEwMSw5IEBAIHN0YXRpYyBzaXplX3QgaWN1X2Zyb21fdWNoYXIoY2hh ciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLAogCQkJCQkJCSBjb25zdCBVQ2hhciAqYnVmZl91 Y2hhciwgaW50MzJfdCBsZW5fdWNoYXIpOwogc3RhdGljIHZvaWQgaWN1X3NldF9jb2xsYXRp b25fYXR0cmlidXRlcyhVQ29sbGF0b3IgKmNvbGxhdG9yLCBjb25zdCBjaGFyICpsb2MsCiAJ CQkJCQkJCQkJIFVFcnJvckNvZGUgKnN0YXR1cyk7Ci1zdGF0aWMgaW50MzJfdCBpY3VfY29u dmVydF9jYXNlKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUs Ci0JCQkJCQkJCVVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3VyY2UsCi0JCQkJ CQkJCWludDMyX3QgbGVuX3NvdXJjZSk7CitzdGF0aWMgaW50MzJfdCBpY3VfY29udmVydF9j YXNlX3VjaGFyKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUs CisJCQkJCQkJCQkgIFVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3VyY2UsCisJ CQkJCQkJCQkgIGludDMyX3QgbGVuX3NvdXJjZSk7CiBzdGF0aWMgaW50MzJfdCB1X3N0clRv VGl0bGVfZGVmYXVsdF9CSShVQ2hhciAqZGVzdCwgaW50MzJfdCBkZXN0Q2FwYWNpdHksCiAJ CQkJCQkJCQkgICBjb25zdCBVQ2hhciAqc3JjLCBpbnQzMl90IHNyY0xlbmd0aCwKIAkJCQkJ CQkJCSAgIGNvbnN0IGNoYXIgKmxvY2FsZSwKQEAgLTM1MCw2MCArMzUxLDEyNiBAQCBzaXpl X3QKIHN0cmxvd2VyX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNo YXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQogewot CWludDMyX3QJCWxlbl91Y2hhcjsKLQlpbnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkgICAq YnVmZl91Y2hhcjsKLQlVQ2hhcgkgICAqYnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0X2xl bjsKLQotCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNs ZW4pOwotCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRvTG93ZXIsIGxvY2Fs ZSwKLQkJCQkJCQkJJmJ1ZmZfY29udiwgYnVmZl91Y2hhciwgbGVuX3VjaGFyKTsKLQlyZXN1 bHRfbGVuID0gaWN1X2Zyb21fdWNoYXIoZGVzdCwgZGVzdHNpemUsIGJ1ZmZfY29udiwgbGVu X2NvbnYpOwotCXBmcmVlKGJ1ZmZfdWNoYXIpOwotCXBmcmVlKGJ1ZmZfY29udik7Ci0KLQly ZXR1cm4gcmVzdWx0X2xlbjsKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VU RjgpCisJeworCQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJVUNhc2VN YXAgICAqY2FzZW1hcDsKKwkJaW50MzJfdAkJbmVlZGVkOworCisJCWNhc2VtYXAgPSB1Y2Fz ZW1hcF9vcGVuKGxvY2FsZS0+aW5mby5pY3UubG9jYWxlLCBVX0ZPTERfQ0FTRV9ERUZBVUxU LCAmc3RhdHVzKTsKKwkJaWYgKFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJP UiwKKwkJCQkJKGVycm1zZygiY2FzZW1hcCBsb29rdXAgZmFpbGVkOiAlcyIsIHVfZXJyb3JO YW1lKHN0YXR1cykpKSk7CisKKwkJc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCQluZWVkZWQg PSB1Y2FzZW1hcF91dGY4VG9Mb3dlcihjYXNlbWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBz cmNsZW4sICZzdGF0dXMpOworCQl1Y2FzZW1hcF9jbG9zZShjYXNlbWFwKTsKKwkJaWYgKHN0 YXR1cyAhPSBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiAmJiBVX0ZBSUxVUkUoc3RhdHVzKSkK KwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJtc2coImNhc2UgY29udmVyc2lvbiBmYWls ZWQ6ICVzIiwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKwkJcmV0dXJuIG5lZWRlZDsKKwl9 CisJZWxzZQorCXsKKwkJaW50MzJfdAkJbGVuX3VjaGFyOworCQlpbnQzMl90CQlsZW5fY29u djsKKwkJVUNoYXIJICAgKmJ1ZmZfdWNoYXI7CisJCVVDaGFyCSAgICpidWZmX2NvbnY7CisJ CXNpemVfdAkJcmVzdWx0X2xlbjsKKworCQlsZW5fdWNoYXIgPSBpY3VfdG9fdWNoYXIoJmJ1 ZmZfdWNoYXIsIHNyYywgc3JjbGVuKTsKKwkJbGVuX2NvbnYgPSBpY3VfY29udmVydF9jYXNl X3VjaGFyKHVfc3RyVG9Mb3dlciwgbG9jYWxlLCAmYnVmZl9jb252LAorCQkJCQkJCQkJCSAg YnVmZl91Y2hhciwgbGVuX3VjaGFyKTsKKwkJcmVzdWx0X2xlbiA9IGljdV9mcm9tX3VjaGFy KGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsKKwkJcGZyZWUoYnVmZl91 Y2hhcik7CisJCXBmcmVlKGJ1ZmZfY29udik7CisKKwkJcmV0dXJuIHJlc3VsdF9sZW47CisJ fQogfQogCiBzaXplX3QKIHN0cnRpdGxlX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNp emUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3Qg bG9jYWxlKQogewotCWludDMyX3QJCWxlbl91Y2hhcjsKLQlpbnQzMl90CQlsZW5fY29udjsK LQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKLQlVQ2hhcgkgICAqYnVmZl9jb252OwotCXNpemVf dAkJcmVzdWx0X2xlbjsKLQotCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hh ciwgc3JjLCBzcmNsZW4pOwotCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRv VGl0bGVfZGVmYXVsdF9CSSwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252LCBidWZmX3Vj aGFyLCBsZW5fdWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBk ZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91Y2hhcik7Ci0J cGZyZWUoYnVmZl9jb252KTsKLQotCXJldHVybiByZXN1bHRfbGVuOworCWlmIChHZXREYXRh YmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKKwl7CisJCVVFcnJvckNvZGUJc3RhdHVzID0g VV9aRVJPX0VSUk9SOworCQlVQ2FzZU1hcCAgICpjYXNlbWFwOworCQlpbnQzMl90CQluZWVk ZWQ7CisKKwkJY2FzZW1hcCA9IHVjYXNlbWFwX29wZW4obG9jYWxlLT5pbmZvLmljdS5sb2Nh bGUsIFVfRk9MRF9DQVNFX0RFRkFVTFQsICZzdGF0dXMpOworCQlpZiAoVV9GQUlMVVJFKHN0 YXR1cykpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJybXNnKCJjYXNlbWFwIGxvb2t1 cCBmYWlsZWQ6ICVzIiwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKworCQlzdGF0dXMgPSBV X1pFUk9fRVJST1I7CisJCW5lZWRlZCA9IHVjYXNlbWFwX3V0ZjhUb1RpdGxlKGNhc2VtYXAs IGRlc3QsIGRlc3RzaXplLCBzcmMsIHNyY2xlbiwgJnN0YXR1cyk7CisJCXVjYXNlbWFwX2Ns b3NlKGNhc2VtYXApOworCQlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9S ICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1z ZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkp OworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNlCisJeworCQlpbnQzMl90CQlsZW5fdWNo YXI7CisJCWludDMyX3QJCWxlbl9jb252OworCQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKKwkJ VUNoYXIJICAgKmJ1ZmZfY29udjsKKwkJc2l6ZV90CQlyZXN1bHRfbGVuOworCisJCWxlbl91 Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNsZW4pOworCQlsZW5f Y29udiA9IGljdV9jb252ZXJ0X2Nhc2VfdWNoYXIodV9zdHJUb1RpdGxlX2RlZmF1bHRfQkks IGxvY2FsZSwgJmJ1ZmZfY29udiwKKwkJCQkJCQkJCQkgIGJ1ZmZfdWNoYXIsIGxlbl91Y2hh cik7CisJCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwgYnVm Zl9jb252LCBsZW5fY29udik7CisJCXBmcmVlKGJ1ZmZfdWNoYXIpOworCQlwZnJlZShidWZm X2NvbnYpOworCisJCXJldHVybiByZXN1bHRfbGVuOworCX0KIH0KIAogc2l6ZV90CiBzdHJ1 cHBlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMs IHNzaXplX3Qgc3JjbGVuLAogCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQlpbnQzMl90 CQlsZW5fdWNoYXI7Ci0JaW50MzJfdAkJbGVuX2NvbnY7Ci0JVUNoYXIJICAgKmJ1ZmZfdWNo YXI7Ci0JVUNoYXIJICAgKmJ1ZmZfY29udjsKLQlzaXplX3QJCXJlc3VsdF9sZW47Ci0KLQls ZW5fdWNoYXIgPSBpY3VfdG9fdWNoYXIoJmJ1ZmZfdWNoYXIsIHNyYywgc3JjbGVuKTsKLQls ZW5fY29udiA9IGljdV9jb252ZXJ0X2Nhc2UodV9zdHJUb1VwcGVyLCBsb2NhbGUsCi0JCQkJ CQkJCSZidWZmX2NvbnYsIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7Ci0JcmVzdWx0X2xlbiA9 IGljdV9mcm9tX3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsK LQlwZnJlZShidWZmX3VjaGFyKTsKLQlwZnJlZShidWZmX2NvbnYpOwotCi0JcmV0dXJuIHJl c3VsdF9sZW47CisJaWYgKEdldERhdGFiYXNlRW5jb2RpbmcoKSA9PSBQR19VVEY4KQorCXsK KwkJVUVycm9yQ29kZQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJCVVDYXNlTWFwICAgKmNh c2VtYXA7CisJCWludDMyX3QJCW5lZWRlZDsKKworCQljYXNlbWFwID0gdWNhc2VtYXBfb3Bl bihsb2NhbGUtPmluZm8uaWN1LmxvY2FsZSwgVV9GT0xEX0NBU0VfREVGQVVMVCwgJnN0YXR1 cyk7CisJCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJ CShlcnJtc2coImNhc2VtYXAgbG9va3VwIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0 dXMpKSkpOworCisJCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJbmVlZGVkID0gdWNhc2Vt YXBfdXRmOFRvVXBwZXIoY2FzZW1hcCwgZGVzdCwgZGVzdHNpemUsIHNyYywgc3JjbGVuLCAm c3RhdHVzKTsKKwkJdWNhc2VtYXBfY2xvc2UoY2FzZW1hcCk7CisJCWlmIChzdGF0dXMgIT0g VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IgJiYgVV9GQUlMVVJFKHN0YXR1cykpCisJCQllcmVw b3J0KEVSUk9SLAorCQkJCQkoZXJybXNnKCJjYXNlIGNvbnZlcnNpb24gZmFpbGVkOiAlcyIs IHVfZXJyb3JOYW1lKHN0YXR1cykpKSk7CisJCXJldHVybiBuZWVkZWQ7CisJfQorCWVsc2UK Kwl7CisJCWludDMyX3QJCWxlbl91Y2hhcjsKKwkJaW50MzJfdAkJbGVuX2NvbnY7CisJCVVD aGFyCSAgICpidWZmX3VjaGFyOworCQlVQ2hhcgkgICAqYnVmZl9jb252OworCQlzaXplX3QJ CXJlc3VsdF9sZW47CisKKwkJbGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZidWZmX3VjaGFy LCBzcmMsIHNyY2xlbik7CisJCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZV91Y2hhcih1 X3N0clRvVXBwZXIsIGxvY2FsZSwgJmJ1ZmZfY29udiwKKwkJCQkJCQkJCQkgIGJ1ZmZfdWNo YXIsIGxlbl91Y2hhcik7CisJCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBk ZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7CisJCXBmcmVlKGJ1ZmZfdWNoYXIpOwor CQlwZnJlZShidWZmX2NvbnYpOworCisJCXJldHVybiByZXN1bHRfbGVuOworCX0KIH0KIAog LyoKQEAgLTU5OSw4ICs2NjYsOCBAQCBpY3VfZnJvbV91Y2hhcihjaGFyICpkZXN0LCBzaXpl X3QgZGVzdHNpemUsIGNvbnN0IFVDaGFyICpidWZmX3VjaGFyLCBpbnQzMl90IGxlbgogfQog CiBzdGF0aWMgaW50MzJfdAotaWN1X2NvbnZlcnRfY2FzZShJQ1VfQ29udmVydF9GdW5jIGZ1 bmMsIHBnX2xvY2FsZV90IG15bG9jYWxlLAotCQkJCSBVQ2hhciAqKmJ1ZmZfZGVzdCwgVUNo YXIgKmJ1ZmZfc291cmNlLCBpbnQzMl90IGxlbl9zb3VyY2UpCitpY3VfY29udmVydF9jYXNl X3VjaGFyKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUsCisJ CQkJCSAgIFVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3VyY2UsIGludDMyX3Qg bGVuX3NvdXJjZSkKIHsKIAlVRXJyb3JDb2RlCXN0YXR1czsKIAlpbnQzMl90CQlsZW5fZGVz dDsKLS0gCjIuNDUuMgoK --------------u2AuZgzJ0OQSaucCGmAtRqnn Content-Type: text/x-patch; charset=UTF-8; name="v1-0002-Reduce-code-duplication-in-ICU-case-mapping-code.patch" Content-Disposition: attachment; filename*0="v1-0002-Reduce-code-duplication-in-ICU-case-mapping-code.pat"; filename*1="ch" Content-Transfer-Encoding: base64 RnJvbSBhNGJmY2JkOGQ5YWQ5YzU2OTk1ZmE0YTY3MzY0ODBmYzExY2UxYmQ0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogRnJpLCAyMCBEZWMgMjAyNCAwMjowMDozMyArMDEwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMi8yXSBSZWR1Y2UgY29kZSBkdXBsaWNhdGlvbiBpbiBJQ1UgY2FzZSBtYXBw aW5nIGNvZGUKCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYyB8 IDc0ICsrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDI2IGlu c2VydGlvbnMoKyksIDQ4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1LmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdf bG9jYWxlX2ljdS5jCmluZGV4IGVlYTZmNDhmNmMzLi45MDViMjMwOGZiZCAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jCkBAIC0xMDEsNiArMTAxLDkgQEAgc3Rh dGljIHNpemVfdCBpY3VfZnJvbV91Y2hhcihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUs CiAJCQkJCQkJIGNvbnN0IFVDaGFyICpidWZmX3VjaGFyLCBpbnQzMl90IGxlbl91Y2hhcik7 CiBzdGF0aWMgdm9pZCBpY3Vfc2V0X2NvbGxhdGlvbl9hdHRyaWJ1dGVzKFVDb2xsYXRvciAq Y29sbGF0b3IsIGNvbnN0IGNoYXIgKmxvYywKIAkJCQkJCQkJCQkgVUVycm9yQ29kZSAqc3Rh dHVzKTsKK3N0YXRpYyBpbnQzMl90IGljdV9jb252ZXJ0X2Nhc2Vfbm9fdXRmOChJQ1VfQ29u dmVydF9GdW5jIGZ1bmMsIGNoYXIgKmRlc3QsCisJCQkJCQkJCQkJc2l6ZV90IGRlc3RzaXpl LCBjb25zdCBjaGFyICpzcmMsCisJCQkJCQkJCQkJc3NpemVfdCBzcmNsZW4sIHBnX2xvY2Fs ZV90IGxvY2FsZSk7CiBzdGF0aWMgaW50MzJfdCBpY3VfY29udmVydF9jYXNlX3VjaGFyKElD VV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUsCiAJCQkJCQkJCQkg IFVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3VyY2UsCiAJCQkJCQkJCQkgIGlu dDMyX3QgbGVuX3NvdXJjZSk7CkBAIC0zNzEsMjIgKzM3NCw3IEBAIHN0cmxvd2VyX2ljdShj aGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBz cmNsZW4sCiAJCXJldHVybiBuZWVkZWQ7CiAJfQogCWVsc2UKLQl7Ci0JCWludDMyX3QJCWxl bl91Y2hhcjsKLQkJaW50MzJfdAkJbGVuX2NvbnY7Ci0JCVVDaGFyCSAgICpidWZmX3VjaGFy OwotCQlVQ2hhcgkgICAqYnVmZl9jb252OwotCQlzaXplX3QJCXJlc3VsdF9sZW47Ci0KLQkJ bGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZidWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7Ci0J CWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZV91Y2hhcih1X3N0clRvTG93ZXIsIGxvY2Fs ZSwgJmJ1ZmZfY29udiwKLQkJCQkJCQkJCQkgIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7Ci0J CXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwgYnVmZl9jb252 LCBsZW5fY29udik7Ci0JCXBmcmVlKGJ1ZmZfdWNoYXIpOwotCQlwZnJlZShidWZmX2NvbnYp OwotCi0JCXJldHVybiByZXN1bHRfbGVuOwotCX0KKwkJcmV0dXJuIGljdV9jb252ZXJ0X2Nh c2Vfbm9fdXRmOCh1X3N0clRvTG93ZXIsIGRlc3QsIGRlc3RzaXplLCBzcmMsIHNyY2xlbiwg bG9jYWxlKTsKIH0KIAogc2l6ZV90CkBAIC00MTMsMjIgKzQwMSw3IEBAIHN0cnRpdGxlX2lj dShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVf dCBzcmNsZW4sCiAJCXJldHVybiBuZWVkZWQ7CiAJfQogCWVsc2UKLQl7Ci0JCWludDMyX3QJ CWxlbl91Y2hhcjsKLQkJaW50MzJfdAkJbGVuX2NvbnY7Ci0JCVVDaGFyCSAgICpidWZmX3Vj aGFyOwotCQlVQ2hhcgkgICAqYnVmZl9jb252OwotCQlzaXplX3QJCXJlc3VsdF9sZW47Ci0K LQkJbGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZidWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7 Ci0JCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZV91Y2hhcih1X3N0clRvVGl0bGVfZGVm YXVsdF9CSSwgbG9jYWxlLCAmYnVmZl9jb252LAotCQkJCQkJCQkJCSAgYnVmZl91Y2hhciwg bGVuX3VjaGFyKTsKLQkJcmVzdWx0X2xlbiA9IGljdV9mcm9tX3VjaGFyKGRlc3QsIGRlc3Rz aXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsKLQkJcGZyZWUoYnVmZl91Y2hhcik7Ci0JCXBm cmVlKGJ1ZmZfY29udik7Ci0KLQkJcmV0dXJuIHJlc3VsdF9sZW47Ci0JfQorCQlyZXR1cm4g aWN1X2NvbnZlcnRfY2FzZV9ub191dGY4KHVfc3RyVG9UaXRsZV9kZWZhdWx0X0JJLCBkZXN0 LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIHNpemVfdApAQCAtNDU1 LDIyICs0MjgsNyBAQCBzdHJ1cHBlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXpl LCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAogCQlyZXR1cm4gbmVlZGVkOwog CX0KIAllbHNlCi0JewotCQlpbnQzMl90CQlsZW5fdWNoYXI7Ci0JCWludDMyX3QJCWxlbl9j b252OwotCQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKLQkJVUNoYXIJICAgKmJ1ZmZfY29udjsK LQkJc2l6ZV90CQlyZXN1bHRfbGVuOwotCi0JCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigm YnVmZl91Y2hhciwgc3JjLCBzcmNsZW4pOwotCQlsZW5fY29udiA9IGljdV9jb252ZXJ0X2Nh c2VfdWNoYXIodV9zdHJUb1VwcGVyLCBsb2NhbGUsICZidWZmX2NvbnYsCi0JCQkJCQkJCQkJ ICBidWZmX3VjaGFyLCBsZW5fdWNoYXIpOwotCQlyZXN1bHRfbGVuID0gaWN1X2Zyb21fdWNo YXIoZGVzdCwgZGVzdHNpemUsIGJ1ZmZfY29udiwgbGVuX2NvbnYpOwotCQlwZnJlZShidWZm X3VjaGFyKTsKLQkJcGZyZWUoYnVmZl9jb252KTsKLQotCQlyZXR1cm4gcmVzdWx0X2xlbjsK LQl9CisJCXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJUb1VwcGVyLCBk ZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIC8qCkBAIC02NjUs NiArNjIzLDI2IEBAIGljdV9mcm9tX3VjaGFyKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6 ZSwgY29uc3QgVUNoYXIgKmJ1ZmZfdWNoYXIsIGludDMyX3QgbGVuCiAJcmV0dXJuIGxlbl9y ZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQzMl90CitpY3VfY29udmVydF9jYXNlX25vX3V0Zjgo SUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCisJ CQkJCQkgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwgcGdfbG9jYWxlX3QgbG9j YWxlKQoreworCWludDMyX3QJCWxlbl91Y2hhcjsKKwlpbnQzMl90CQlsZW5fY29udjsKKwlV Q2hhcgkgICAqYnVmZl91Y2hhcjsKKwlVQ2hhcgkgICAqYnVmZl9jb252OworCXNpemVfdAkJ cmVzdWx0X2xlbjsKKworCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwg c3JjLCBzcmNsZW4pOworCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZV91Y2hhcihmdW5j LCBsb2NhbGUsICZidWZmX2NvbnYsCisJCQkJCQkJCQkgIGJ1ZmZfdWNoYXIsIGxlbl91Y2hh cik7CisJcmVzdWx0X2xlbiA9IGljdV9mcm9tX3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZm X2NvbnYsIGxlbl9jb252KTsKKwlwZnJlZShidWZmX3VjaGFyKTsKKwlwZnJlZShidWZmX2Nv bnYpOworCisJcmV0dXJuIHJlc3VsdF9sZW47Cit9CisKIHN0YXRpYyBpbnQzMl90CiBpY3Vf Y29udmVydF9jYXNlX3VjaGFyKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3Qg bXlsb2NhbGUsCiAJCQkJCSAgIFVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3Vy Y2UsIGludDMyX3QgbGVuX3NvdXJjZSkKLS0gCjIuNDUuMgoK --------------u2AuZgzJ0OQSaucCGmAtRqnn--