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 1w5ZQS-003Nrw-22 for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 01:22:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5ZQQ-000Q4M-2h for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 01:22:19 +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 1w5ZQQ-000Q4D-1O for pgsql-hackers@lists.postgresql.org; Thu, 26 Mar 2026 01:22:18 +0000 Received: from mail-lf1-x131.google.com ([2a00:1450:4864:20::131]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5ZQO-000000013wr-3OHT for pgsql-hackers@postgresql.org; Thu, 26 Mar 2026 01:22:17 +0000 Received: by mail-lf1-x131.google.com with SMTP id 2adb3069b0e04-59dcdf60427so568952e87.3 for ; Wed, 25 Mar 2026 18:22:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774488135; cv=none; d=google.com; s=arc-20240605; b=edF9nlsgL9ty04Te9IP/eia0NV7/gdRvcu9PUCqMDZscgOjFhFZbR2C5dS1i+no2Lg 7HBIwY6mQs6od+aSjz8fB1hPi8IZVna3joO/0TMYNzxrr+VynTk1vmiF7ZLe+RJUvl42 dIWickdaVgZ5cH4LLyzLZZdERC6k/lJtRIBxihgDHX++6MvhBgExBAtPqgIjihuIuM+1 IZ48dN3XlDAr6VTTv0obbTrESwjUU/xw+LZ5YQWBuyYUUalWVZ1HQMwWq0PqAM75gluz b84hcASaRDaNPgNB7QrL7PmQrZEjU3f/Cc+9et5C3N3a0HE7qSrfTR1AHNjAtkkWj8/1 f9ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=1xTIA8ZHM9fM/MGpafzMOmPySUIgoidGYa8BIfynJU4=; fh=eUznE29z76ldRUh7v9JVKo4xEkvOLukZaF3CxaBk4Cs=; b=TSzPXMpOrEdbfHQMq2tmmut0HcmdDU25szJ3fNoXSk83j6jnWHkz3QT8B1NnlEHMkF T8W4IqL2Ebfyxqg01lzTLUAJvOtMCSeDCbWHGLwgnNmwBod86HPskVKvuubmlELQ4RuH ybiB37AmaNOr5e/vhOWx4l58OPjCRulWfV7x59G12koC9IcjzdZeYYSDJ/vMJ+fodn9k J2oppqjnWfvIFAbENrbggpl6FS4c4DJ0Qgv9u5oxxhyp02rB3uA/sHYk/f2u/gf7kL6U CB6DkkQn9siia3Px4596Y3J/tWgPOmRbRO2gZTsQaAlQlmrLdFhB2W9AcbzoBi3AyI6e 7X3w==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774488135; x=1775092935; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=1xTIA8ZHM9fM/MGpafzMOmPySUIgoidGYa8BIfynJU4=; b=Fvkc3YuJo+NNYVe2Ku8Q9M/v41oPWJ3J434COy3NV92jhtkHTz94h++usGheWTMSbn 4kYhlny1ZLa6LXgZgBkkvTGUETYL+Oz/HeSINz7tmO0y6Px5QdWuWKa97XLkbZHOD9EY RDGwx+ejfDDf7m9OFl/w9tVbkozyVk7f6dts83SBtlv20X+R3r8rzmqxODywWKT+mhoz cDxG383Gq1mJX1iCI53Giao0EYMCJ36n3Ifgu400ogZMHz3TzCe6Mg0oJcQS/7/NVzlK qhXfih4rNapc0JHB8oLmL4tcBDufFWerzPNR85uh8Q6hwPUAl+13L+eET+byfwISQ1B8 kiIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774488135; x=1775092935; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=1xTIA8ZHM9fM/MGpafzMOmPySUIgoidGYa8BIfynJU4=; b=tByZcQ8OiyyKObeN9kTWBkndqqEwadKNsYXaB+BjAH5k5u3aNejnDfaena7VUWrYzK M1c5CkEpcaBjysj2Hz7mI6TjcZ5aUfWx019frI3sj+PCDdxo2bUfeH1GydHD8Me5Zf9h 7UZIZ1q9naYeGcK49FI/QMsOradn5BnrG5BrGto8ekJwpsDoMjg8F9P2Xu0hdoxUl7k5 ao3UO9J78QC0rkvFGYvwM3MUobXAe5/uams5J8yrBvjiRfQ86h4PTaS24wYmmfnSOS0y 8quwMqJgELWkh+S72FXa3AJ1hqbq8mg+KYZjclydfKNLiMktTC8knQUFIb5C1zlYD+R5 UlLw== X-Forwarded-Encrypted: i=1; AJvYcCWw39MqwrLuDom1roq/Zy3W48XLPrRlp5P/sm2N7kFb85bIzxcDYA64HjeUE0nW2QRLiMwNYqo4TzPho5+I@postgresql.org X-Gm-Message-State: AOJu0Yw7m17RRXVwSRy76q0gg6E1SMR1CtfUgMCSdHUEvBvZRRvtN71l 1TgQa/eOBmrC6sIRwCUhOaUcZNsG6JnyO8DFSlv92Ij2uMJiryznrvg1Si6mZ4uPqYfev5LnY3c ZocEXGUGXmo+8g3/2jsDfIVmk9qFXMd0= X-Gm-Gg: ATEYQzySFIzFE5vB91EyTdlpTK1ovD3ljzNYWdVRSJ58myQOJYlCq1iE2gk87JExXRs ZywY+V8D26al2Qg6FU6/yV8nlcz8VrUH+jzCKLA0PHTS21hXzl3Jh7YFsOqywInjweRnvA53h02 OB9LuLOFEiONPXVGxy43E11j62LogQ2ogdgKLuppnSiMJMd0NAmtewzC1v7Txn/+4jfXvNnYv1g Mas/Ovq9zaDz3hzQF2wVZISj3L48dqct5+1xndUqE3Cu+yDMvP8Wxtm+Cl4TsxqUMt6cy4IoU4d gyeFPP+S X-Received: by 2002:a05:6512:683:b0:5a1:440f:512f with SMTP id 2adb3069b0e04-5a29b98f665mr1880421e87.27.1774488135109; Wed, 25 Mar 2026 18:22:15 -0700 (PDT) MIME-Version: 1.0 References: <1791665551.452444.1761209220211.ref@mail.yahoo.com> <878qbn51kb.fsf@wibble.ilmari.org> <1F13AF7E-B90A-40FB-B47C-DC38FBB08353@gmail.com> <01aac5bb-63b1-420f-b396-fdc2027fbb50@vondra.me> <688741.1774485357@sss.pgh.pa.us> In-Reply-To: From: Masahiko Sawada Date: Wed, 25 Mar 2026 18:21:38 -0700 X-Gm-Features: AQROBzCxhv7syLqBW7PWedgRvMfpntoxw9J3i9bwTuH8QL7tJ_G3eQRwNEsf9Nk Message-ID: Subject: Re: Add uuid_to_base32hex() and base32hex_to_uuid() built-in functions To: Tom Lane Cc: Tomas Vondra , Aleksander Alekseev , pgsql-hackers , Chao Li , =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= , Andrey Borodin Content-Type: multipart/mixed; boundary="000000000000f3b9cd064de33668" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f3b9cd064de33668 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Mar 25, 2026 at 6:09=E2=80=AFPM Masahiko Sawada wrote: > > On Wed, Mar 25, 2026 at 5:35=E2=80=AFPM Tom Lane wrot= e: > > > > Tomas Vondra writes: > > > On 3/26/26 00:40, Tom Lane wrote: > > >> I believe what's happening there is that in cs_CZ locale, > > >> "V" doesn't follow simple ASCII sort ordering. > > > > > With cs_CZ all letters sort *before* numbers, while in en_US it's the > > > other way around. V is not special in any way. > > > > Ah, sorry, I should have researched a bit instead of relying on > > fading memory. The quirk I was thinking of is that in cs_CZ, > > "ch" sorts after "h": > > > > u8=3D# select 'h' < 'ch'::text collate "en_US"; > > ?column? > > ---------- > > f > > (1 row) > > > > u8=3D# select 'h' < 'ch'::text collate "cs_CZ"; > > ?column? > > ---------- > > t > > (1 row) > > > > Regular hex encoding isn't bitten by that because it doesn't > > use 'h' in the text form ... but this base32hex thingie does. > > > > However, your point is also correct: > > > > u8=3D# select '0' < 'C'::text ; > > ?column? > > ---------- > > t > > (1 row) > > > > u8=3D# select '0' < 'C'::text collate "cs_CZ"; > > ?column? > > ---------- > > f > > (1 row) > > > > and that breaks "text ordering matches numeric ordering" > > for both traditional hex and base32hex. So maybe this > > is not as big a deal as I first thought. We need a fix > > for the new test though. Probably adding COLLATE "C" > > would be enough. > > Thank you for the report and the analysis. > > I've reproduced the issue with "cs_CZ" collation and adding COLLATE > "C" to the query resolves it. It seems also a good idea to add a note > in the documentation too as users might face the same issue. For > example, > > To maintain the lexicographical sort order of the encoded data, ensure > that the text is sorted using the C collation (e.g., using COLLATE > "C"). Natural language collations may sort characters differently and > break the ordering. > Attached the patch doing the above idea. Regards, --=20 Masahiko Sawada Amazon Web Services: https://aws.amazon.com --000000000000f3b9cd064de33668 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Fix-UUID-sortability-tests-in-base32hex-encoding.patch" Content-Disposition: attachment; filename="0001-Fix-UUID-sortability-tests-in-base32hex-encoding.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn6scnjo0 RnJvbSBhNjRmM2Y2NGE5ZjA0YzFmNWRhOWE1MWZlNzYwYzQwNDgwNTg1ZmQ0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlrbyBTYXdhZGEgPHNhd2FkYS5tc2hrQGdtYWlsLmNv bT4KRGF0ZTogV2VkLCAyNSBNYXIgMjAyNiAxODowNzoxMSAtMDcwMApTdWJqZWN0OiBbUEFUQ0hd IEZpeCBVVUlEIHNvcnRhYmlsaXR5IHRlc3RzIGluIGJhc2UzMmhleCBlbmNvZGluZy4KClRoZSBy ZWNlbnRseSBhZGRlZCB0ZXN0IGZvciBiYXNlMzJoZXggZW5jb2Rpbmcgb2YgVVVJRHMgZmFpbGVk IG9uCmJ1aWxkZmFybSBtZW1iZXIgaGlwcG9wb3RhbXVzIHVzaW5nIG5hdHVyYWwgbGFuZ3VhZ2Ug bG9jYWxlcyAoc3VjaCBhcwpjc19DWikuIFRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aG9zZSBjb2xs YXRpb25zIG1heSBzb3J0IGNoYXJhY3RlcnMKZGlmZmVyZW50bHksIHdoaWNoIGJyZWFrcyB0aGUg c3RyaWN0IGJ5dGUtd2lzZSBsZXhpY29ncmFwaGljYWwKb3JkZXJpbmcgZXhwZWN0ZWQgYnkgYmFz ZTMyaGV4IGVuY29kaW5nLgoKVGhpcyBjb21taXQgZml4ZXMgdGhlIHJlZ3Jlc3Npb24gdGVzdHMg YnkgZXhwbGljaXRseSB1c2luZyB0aGUgQwpjb2xsYXRpb24uIEFkZGl0aW9uYWxseSwgYWRkIGEg bm90ZSB0byB0aGUgZG9jdW1lbnRhdGlvbiB0byB3YXJtIHVzZXJzCnRoYXQgdGhleSBtdXN0IHVz ZSB0aGUgQyBjb2xsYXRpb24gaWYgdGhleSB3YW50IHRvIG1haW50YWluIHRoZQpsZXhpY29ncmFw aGljYWwgc29ydCBvcmRlciBvZiB0aGUgZW5jb2RlZCBkYXRhLgoKUGVyIGJ1aWxkZmFybSBtZW1i ZXIgaGlwcG9wb3RhbXVzLgoKQW5hbHl6ZWQtYnk6IFRvbSBMYW5lIDx0Z2xAc3NzLnBnaC5wYS51 cz4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS82ODI0MTcuMTc3NDQ4MjA0N0Bzc3Mu cGdoLnBhLnVzCi0tLQogZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1iaW5hcnlzdHJpbmcuc2dtbCB8 IDkgKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3V1aWQub3V0ICAgICAgIHwg NyArKysrKy0tCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC91dWlkLnNxbCAgICAgICAgICAgIHwgNyAr KysrKy0tCiAzIGZpbGVzIGNoYW5nZWQsIDE5IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1iaW5hcnlzdHJpbmcuc2dtbCBi L2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtYmluYXJ5c3RyaW5nLnNnbWwKaW5kZXggMGFhZjliYzY4 ZjEuLjJhZDJjZGJlYTgyIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWJpbmFy eXN0cmluZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtYmluYXJ5c3RyaW5nLnNn bWwKQEAgLTc5MCw2ICs3OTAsMTUgQEAKICAgICAgICBwcm9kdWNlcyBhIDI2LWNoYXJhY3RlciBz dHJpbmcgY29tcGFyZWQgdG8gdGhlIHN0YW5kYXJkIDM2LWNoYXJhY3RlcgogICAgICAgIFVVSUQg cmVwcmVzZW50YXRpb24uCiAgICAgICA8L3BhcmE+CisKKyAgICAgIDxub3RlPgorICAgICAgIDxw YXJhPgorICAgICAgICBUbyBtYWludGFpbiB0aGUgbGV4aWNvZ3JhcGhpY2FsIHNvcnQgb3JkZXIg b2YgdGhlIGVuY29kZWQgZGF0YSwKKyAgICAgICAgZW5zdXJlIHRoYXQgdGhlIHRleHQgaXMgc29y dGVkIHVzaW5nIHRoZSBDIGNvbGxhdGlvbgorICAgICAgICAoZS5nLiwgdXNpbmcgPGxpdGVyYWw+ Q09MTEFURSAiQyI8L2xpdGVyYWw+KS4gTmF0dXJhbCBsYW5ndWFnZQorICAgICAgICBjb2xsYXRp b25zIG1heSBzb3J0IGNoYXJhY3RlcnMgZGlmZmVyZW50bHkgYW5kIGJyZWFrIHRoZSBvcmRlcmlu Zy4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L25vdGU+CiAgICAgIDwvbGlzdGl0ZW0+CiAgICAg PC92YXJsaXN0ZW50cnk+CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv dXVpZC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3V1aWQub3V0CmluZGV4IDE0MmM1 MjllNjkzLi45YzVkZGE5ZTlhYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC91dWlkLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3V1aWQub3V0CkBAIC0y MzYsOCArMjM2LDExIEBAIFNFTEVDVCBhcnJheV9hZ2coaWQgT1JERVIgQlkgZ3VpZF9maWVsZCkg RlJPTSBndWlkMzsKICB7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTJ9CiAoMSByb3cpCiAKLS0t IG1ha2Ugc3VyZSBiYXNlMzJoZXggZW5jb2Rpbmcgd29ya3Mgd2l0aCBVVUlEcyBhbmQgcHJlc2Vy dmVzIG9yZGVyaW5nCi1TRUxFQ1QgYXJyYXlfYWdnKGlkIE9SREVSIEJZIGd1aWRfZW5jb2RlZCkg RlJPTSBndWlkMzsKKy0tIFRlc3QgYmFzZTMyaGV4IGVuY29kaW5nIG9mIFVVSURzIGFuZCBpdHMg bGV4aWNvZ3JhcGhpY2FsIHNvcnRpbmcgcHJvcGVydHkuCistLSBDT0xMQVRFICJDIiBpcyByZXF1 aXJlZCB0byBwcmV2ZW50IGJ1aWxkZmFybSBmYWlsdXJlcyBpbiBub24tQyBsb2NhbGVzCistLSB3 aGVyZSBuYXR1cmFsIGxhbmd1YWdlIGNvbGxhdGlvbnMgKHN1Y2ggYXMgY3NfQ1opIHdvdWxkIGJy ZWFrIHN0cmljdAorLS0gYnl0ZS13aXNlIG9yZGVyaW5nLgorU0VMRUNUIGFycmF5X2FnZyhpZCBP UkRFUiBCWSBndWlkX2VuY29kZWQgQ09MTEFURSAiQyIpIEZST00gZ3VpZDM7CiAgICAgICAgICAg YXJyYXlfYWdnICAgICAgICAgICAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHsx LDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMn0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3V1aWQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvdXVpZC5zcWwKaW5kZXggZjJmZjAw ZjVkZGQuLjhjYzJhZDQwNjE0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC91dWlk LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC91dWlkLnNxbApAQCAtMTIyLDggKzEyMiwx MSBAQCBJTlNFUlQgSU5UTyBndWlkMyAoZ3VpZF9maWVsZCkgU0VMRUNUIHV1aWR2NygpIEZST00g Z2VuZXJhdGVfc2VyaWVzKDEsIDEwKTsKIElOU0VSVCBJTlRPIGd1aWQzIChndWlkX2ZpZWxkKSBW QUxVRVMgKCdmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnOjp1dWlkKTsKIFNF TEVDVCBhcnJheV9hZ2coaWQgT1JERVIgQlkgZ3VpZF9maWVsZCkgRlJPTSBndWlkMzsKIAotLS0g bWFrZSBzdXJlIGJhc2UzMmhleCBlbmNvZGluZyB3b3JrcyB3aXRoIFVVSURzIGFuZCBwcmVzZXJ2 ZXMgb3JkZXJpbmcKLVNFTEVDVCBhcnJheV9hZ2coaWQgT1JERVIgQlkgZ3VpZF9lbmNvZGVkKSBG Uk9NIGd1aWQzOworLS0gVGVzdCBiYXNlMzJoZXggZW5jb2Rpbmcgb2YgVVVJRHMgYW5kIGl0cyBs ZXhpY29ncmFwaGljYWwgc29ydGluZyBwcm9wZXJ0eS4KKy0tIENPTExBVEUgIkMiIGlzIHJlcXVp cmVkIHRvIHByZXZlbnQgYnVpbGRmYXJtIGZhaWx1cmVzIGluIG5vbi1DIGxvY2FsZXMKKy0tIHdo ZXJlIG5hdHVyYWwgbGFuZ3VhZ2UgY29sbGF0aW9ucyAoc3VjaCBhcyBjc19DWikgd291bGQgYnJl YWsgc3RyaWN0CistLSBieXRlLXdpc2Ugb3JkZXJpbmcuCitTRUxFQ1QgYXJyYXlfYWdnKGlkIE9S REVSIEJZIGd1aWRfZW5jb2RlZCBDT0xMQVRFICJDIikgRlJPTSBndWlkMzsKIAogLS0gQ2hlY2sg dGhlIHRpbWVzdGFtcCBvZmZzZXRzIGZvciB2Ny4KIC0tCi0tIAoyLjUzLjAKCg== --000000000000f3b9cd064de33668--