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 1r2TB3-00GweT-QW for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Nov 2023 09:24:18 +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 1r2TB1-00EAAc-0J for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Nov 2023 09:24:15 +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 1r2TAz-00EAAJ-4W for pgsql-hackers@lists.postgresql.org; Mon, 13 Nov 2023 09:24:14 +0000 Received: from wout1-smtp.messagingengine.com ([64.147.123.24]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r2TAv-005L9G-BW for pgsql-hackers@postgresql.org; Mon, 13 Nov 2023 09:24:11 +0000 Received: from compute7.internal (compute7.nyi.internal [10.202.2.48]) by mailout.west.internal (Postfix) with ESMTP id 76479320027A for ; Mon, 13 Nov 2023 04:24:06 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute7.internal (MEProxy); Mon, 13 Nov 2023 04:24:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eisentraut.org; h=cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:sender:subject:subject:to:to; s=fm2; t=1699867445; x=1699953845; bh=NUmp8njlhh+LhNevUpv6vFMek 2vT6Q8nVAdhH9o3iZQ=; b=X8ZgRSb9+5Fx3vlnXNJFLAGce9vTmSRR1Knr/W/UM fiw9n62l/UEdEfeSD9G9fdvcSuwILmroVrODSCuBGdc8055cKMtpalZ75hxPzmBP CQXKhAGVQrAwDyqBcS5TAiV/U/ZGrMrMtJm68onT7xND3J2hssQY659CEc69yqeH BnOa54JowOgZacAIiWBjpPi0gMQ7FHzt1mQGuHVRKGl5WaWjsKGbQmM7Z2+cphXa nkK5bxvr8NKZUxoOHqmc/iA6X6zUJqlgKYPboZSOfHQ8rfABs0T2ldUxLzpTU9B+ 70+IFfp1apOcQDlYmEJKq2Eua0sVBG4ewadQ8JI1Ebb9Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1699867445; x=1699953845; bh=NUmp8njlhh+LhNevUpv6vFMek2vT6Q8nVAd hH9o3iZQ=; b=dN/dG5h752oJx/gMpvX0CoOhxzzZHN8mq0s83A2OROEiRdyvuXv TbHcw6fXzVGrb0PLuePQGf8XWoyrCmvCO8PZXRUth3PK5amVCdpb+qwutuexrBi4 pG74UnZ15rEjc9TiifDZTaZqZWTomBnvuqj2vsnrMvMsVG6yEshJwLwTa8LGAueL qeJIoTv71ENLpHlBbyzOvPC18oeY6PItHJ6uOCrr80MuT5gjjShx5UiwrN8a89Xv nHZa8k2jsDZoI3q9g8AyyevxbA0iUk9KaUKP4cV56cInTV0nAiGM7rw0FSv1uqT1 a4rqHtVpjkl8Vo4bqBNL/3sduqzm8cEwPfA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrudeftddgtdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpegtkfffgggfhffuvfesmhdtreertd dvjeenucfhrhhomheprfgvthgvrhcugfhishgvnhhtrhgruhhtuceophgvthgvrhesvghi shgvnhhtrhgruhhtrdhorhhgqeenucggtffrrghtthgvrhhnpeehteekudegtdehtedtte fhudekjefgudeiheeiteffuedtteffkeekgfelvdffleenucevlhhushhtvghrufhiiigv pedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehpvghtvghrsegvihhsvghnthhrrghuth drohhrgh X-ME-Proxy: Feedback-ID: ie0a040ee:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Mon, 13 Nov 2023 04:24:05 -0500 (EST) Content-Type: multipart/mixed; boundary="------------q9X2D6quAWtSgkjFNAXq3Rpm" Message-ID: <3327cb54-f7f1-413b-8fdb-7a9dceebb938@eisentraut.org> Date: Mon, 13 Nov 2023 10:24:03 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Peter Eisentraut Subject: should check collations when creating partitioned index To: pgsql-hackers 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. --------------q9X2D6quAWtSgkjFNAXq3Rpm Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit When creating a partitioned index, the partition key must be a subset of the index's columns. DefineIndex() explains: * If this table is partitioned and we're creating a unique index, primary * key, or exclusion constraint, make sure that the partition key is a * subset of the index's columns. Otherwise it would be possible to * violate uniqueness by putting values that ought to be unique in * different partitions. But this currently doesn't check that the collations between the partition key and the index definition match. So you can construct a unique index that fails to enforce uniqueness. Here is a non-partitioned case for reference: create collation case_insensitive (provider=icu, locale='und-u-ks-level2', deterministic=false); create table t0 (a int, b text); create unique index i0 on t0 (b collate case_insensitive); insert into t0 values (1, 'a'), (2, 'A'); -- violates unique constraint Here is a partitioned case that doesn't work correctly: create table t1 (a int, b text) partition by hash (b); create table t1a partition of t1 for values with (modulus 2, remainder 0); create table t1b partition of t1 for values with (modulus 2, remainder 1); create unique index i1 on t1 (b collate case_insensitive); insert into t1 values (1, 'a'), (2, 'A'); -- this succeeds The attached patch adds the required collation check. In the example, it would not allow the index i1 to be created. --------------q9X2D6quAWtSgkjFNAXq3Rpm Content-Type: text/plain; charset=UTF-8; name="0001-Check-collation-when-creating-partitioned-index.patch" Content-Disposition: attachment; filename*0="0001-Check-collation-when-creating-partitioned-index.patch" Content-Transfer-Encoding: base64 RnJvbSAzYWNkNTlkY2Q3ZGZmY2ZkMjJlNjFjY2UzYWMxYmI0YzY5ODJkMTZkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxMyBOb3YgMjAyMyAxMDoxNToyMyArMDEwMApTdWJqZWN0 OiBbUEFUQ0hdIENoZWNrIGNvbGxhdGlvbiB3aGVuIGNyZWF0aW5nIHBhcnRpdGlvbmVkIGlu ZGV4CgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jIHwgMTIgKysrKysr KysrKystCiAxIGZpbGUgY2hhbmdlZCwgMTEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigt KQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5jIGIvc3Jj L2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggYzE2MGQ4YTMwMS4uNzI5ZjIw MDM5NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKQEAgLTEwMTEsMTAgKzEwMTEs MjAgQEAgRGVmaW5lSW5kZXgoT2lkIHRhYmxlSWQsCiAJCQl7CiAJCQkJaWYgKGtleS0+cGFy dGF0dHJzW2ldID09IGluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1tqXSkKIAkJCQl7 Ci0JCQkJCS8qIE1hdGNoZWQgdGhlIGNvbHVtbiwgbm93IHdoYXQgYWJvdXQgdGhlIGVxdWFs aXR5IG9wPyAqLworCQkJCQkvKiBNYXRjaGVkIHRoZSBjb2x1bW4sIG5vdyB3aGF0IGFib3V0 IHRoZSBjb2xsYXRpb24gYW5kIGVxdWFsaXR5IG9wPyAqLwogCQkJCQlPaWQJCQlpZHhfb3Bm YW1pbHk7CiAJCQkJCU9pZAkJCWlkeF9vcGNpbnR5cGU7CiAKKwkJCQkJaWYgKGtleS0+cGFy dGNvbGxhdGlvbltpXSAhPSBjb2xsYXRpb25JZHNbal0pCisJCQkJCXsKKwkJCQkJCUZvcm1f cGdfYXR0cmlidXRlIGF0dCA9IFR1cGxlRGVzY0F0dHIoUmVsYXRpb25HZXREZXNjcihyZWwp LCBrZXktPnBhcnRhdHRyc1tpXSAtIDEpOworCisJCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJ CQkJCQllcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJCQkJ ZXJybXNnKCJjb2xsYXRpb24gb2YgY29sdW1uIFwiJXNcIiBkb2VzIG5vdCBtYXRjaCBiZXR3 ZWVuIHBhcnRpdGlvbiBrZXkgYW5kIGluZGV4IGRlZmluaXRpb24iLAorCQkJCQkJCQkJICAg TmFtZVN0cihhdHQtPmF0dG5hbWUpKSk7CisJCQkJCX0KKwogCQkJCQlpZiAoZ2V0X29wY2xh c3Nfb3BmYW1pbHlfYW5kX2lucHV0X3R5cGUob3BjbGFzc0lkc1tqXSwKIAkJCQkJCQkJCQkJ CQkJCSZpZHhfb3BmYW1pbHksCiAJCQkJCQkJCQkJCQkJCQkmaWR4X29wY2ludHlwZSkpCi0t IAoyLjQyLjEKCg== --------------q9X2D6quAWtSgkjFNAXq3Rpm--