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 1tGoUh-000wpD-Ep for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2024 00:04:23 +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 1tGoUe-002L9N-Mo for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2024 00:04:21 +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 1tGoUe-002L97-6k for pgsql-hackers@lists.postgresql.org; Fri, 29 Nov 2024 00:04:21 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tGoUc-0004t7-Nv for pgsql-hackers@postgresql.org; Fri, 29 Nov 2024 00:04:20 +0000 Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-a9a68480164so155855966b.3 for ; Thu, 28 Nov 2024 16:04:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732838657; x=1733443457; 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=glh6tvGLo8mvEzwJEcUXctUR+ssqausmkW2OxFmJCo4=; b=MozB2QAiHYuqbOmR/By9uYUamdsje1vDM5oUJk+X/ZmYr5Tu4SsHyEMtQlEgnbkjWU TFGz5liRBPh/ZCHGbuL9irh/e5nzeN9iCRIdaVT8Wj7YVfDbYTWF+zrD7vFSqrzUHWBE 5aT0DAzQEly4Vq+ejtSXS44DGKMei/cdBXoa+TpbN7HFQHOzoNX+chQ/65Mtum5F0twj K6lQuQVyv5F+6EIeh3poKeS4e58gX+wDhQWyLHuqJOaGWM27mkQcwcqQFCmbnd0BuY0S HtbT0eO5OjMkRDwAeLdef3CZLmuTiMgmFPbyIkfUtFM7uBRa3N0zICNm8BdiqPqmj7Pv Z8gQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732838657; x=1733443457; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=glh6tvGLo8mvEzwJEcUXctUR+ssqausmkW2OxFmJCo4=; b=cnqZmTc31xqrVqpVqdE4OrpeZ0RggDoYaRaUxDnuhUv8IxAcW1u7M49c7rqVi0gqpa 5CoI7Id/30QZ90yrxP5Rv0SNxdTvoma4V2yiDjqigTTjbBbuVzUJQI6ivv75ybUl/tmH oAdAF9Sm+KA4xY0LDhhTq8OXm0bYA8Aa5kR2tfC54U6b8RZlEKobDkY3A/FgeIEe6ERE 07FPBfoqKFn6oCMhJK0HV9g28lcgl30GrTI0MawL4GFEAF7JBIcDp2ZKt+5i3D2BO666 FIn/8uqkLislxsDB5hX4y4U/idBeMWvLIPvnMuevpXg+X9LzmIKe9+/WhwJGUAD/Xl2/ UGIw== X-Forwarded-Encrypted: i=1; AJvYcCU5aEButEkbKsZ1ARkINV507w6ZcS5fz0cQ7Uf0m4sv3wGNYXFyAp7+HKpd8WQLdOlSPwpItfcOS5EVo5O0@postgresql.org X-Gm-Message-State: AOJu0YwUTj+2nmovyArh5f34a9loKraDVlJ6v+QRQY2NwAMgYXHGw/UO GapSGmtOMlM+Vx6ahAHFfn3Uxr3mO5X2+GiT3eUSUlFhG9H7lUcRM6kvVu+V6ao2F8ywfObapVy +D+B2Mk0+HPu1AQ3pznYUkoSQYf4= X-Gm-Gg: ASbGncuCVCwBIc1JA84W9oSoVjeqZAWniQejK0Q+OMppRrpO8bCydeDx/5AMDsIYYiA 2PqxELjl770J78dZlvcipKaxrexF+EGw= X-Google-Smtp-Source: AGHT+IH6wCiEj5hq8IiGhZoyNHPdFHTC018R5hxlO3GSTn3xns29slFrIz7eBJ6M7AfeAuvVVvynM3gGYkw7WyEzDpk= X-Received: by 2002:a17:906:3143:b0:a9a:6d7:9c4 with SMTP id a640c23a62f3a-aa580ef31b5mr671612866b.12.1732838656912; Thu, 28 Nov 2024 16:04:16 -0800 (PST) MIME-Version: 1.0 References: <567ED6CA.2040504@sigaev.ru> <45050ba9-3777-4cc1-89ad-a02deebe7729@gmail.com> <0026f562-d403-4f97-b9dc-3fe3a279e8c9@postgrespro.ru> <37bf870a-22e0-4aba-b845-549482118f8d@gmail.com> <8174de69-9e1a-0827-0e81-ef97f56a5939@gmail.com> <3b717020-14d9-425f-8c60-ce336b5a23b3@postgrespro.ru> In-Reply-To: <3b717020-14d9-425f-8c60-ce336b5a23b3@postgrespro.ru> From: Alexander Korotkov Date: Fri, 29 Nov 2024 02:04:05 +0200 Message-ID: Subject: Re: POC, WIP: OR-clause support for indexes To: Alena Rybakina Cc: Ranier Vilela , Alexander Lakhin , Andrei Lepikhov , jian he , Robert Haas , Nikolay Shaplov , pgsql-hackers@lists.postgresql.org, pgsql-hackers@postgresql.org, Peter Geoghegan , Marcos Pegoraro , teodor@sigaev.ru, Peter Eisentraut Content-Type: multipart/mixed; boundary="0000000000009967ae062801f092" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009967ae062801f092 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Nov 28, 2024 at 9:33=E2=80=AFPM Alena Rybakina wrote: > > On 28.11.2024 22:28, Ranier Vilela wrote: > > Em qui., 28 de nov. de 2024 =C3=A0s 16:03, Alena Rybakina escreveu: >> >> Hi! Thank you for the case. >> >> On 28.11.2024 21:00, Alexander Lakhin wrote: >> > Hello Alexander, >> > >> > 21.11.2024 09:34, Alexander Korotkov wrote: >> >> I'm going to push this if no objections. >> > >> > Please look at the following query, which triggers an error after >> > ae4569161: >> > SET random_page_cost =3D 1; >> > CREATE TABLE tbl(u UUID); >> > CREATE INDEX idx ON tbl USING HASH (u); >> > SELECT COUNT(*) FROM tbl WHERE u =3D '00000000000000000000000000000000= ' OR >> > u =3D '11111111111111111111111111111111'; >> > >> > ERROR: XX000: ScalarArrayOpExpr index qual found where not allowed >> > LOCATION: ExecIndexBuildScanKeys, nodeIndexscan.c:1625 >> > >> > >> I found out what the problem is index scan method was not generated. We >> need to check this during OR clauses for SAOP transformation. >> >> There is a patch to fix this problem. > > Hi. > Thanks for the quick fix. > > But I wonder if it is not possible to avoid all if the index is useless? > Maybe moving your fix to the beginning of the function? > > diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimize= r/path/indxpath.c > index d827fc9f4d..5ea0b27d01 100644 > --- a/src/backend/optimizer/path/indxpath.c > +++ b/src/backend/optimizer/path/indxpath.c > @@ -3248,6 +3248,10 @@ match_orclause_to_indexcol(PlannerInfo *root, > Assert(IsA(orclause, BoolExpr)); > Assert(orclause->boolop =3D=3D OR_EXPR); > > + /* Ignore index if it doesn't support index scans */ > + if(!index->amsearcharray) > + return NULL; > + > > Agree. I have updated the patch > > /* > * Try to convert a list of OR-clauses to a single SAOP expression. Each > * OR entry must be in the form: (indexkey operator constant) or (consta= nt > > The test bug: > EXPLAIN SELECT COUNT(*) FROM tbl WHERE u =3D '000000000000000000000000000= 00000' OR u =3D '11111111111111111111111111111111'; > QUERY PLAN > -------------------------------------------------------------------------= --------------------------------------------------------- > Aggregate (cost=3D12.46..12.47 rows=3D1 width=3D8) > -> Bitmap Heap Scan on tbl (cost=3D2.14..12.41 rows=3D18 width=3D0) > Recheck Cond: ((u =3D '00000000-0000-0000-0000-000000000000'::uu= id) OR (u =3D '11111111-1111-1111-1111-111111111111'::uuid)) > -> BitmapOr (cost=3D2.14..2.14 rows=3D18 width=3D0) > -> Bitmap Index Scan on idx (cost=3D0.00..1.07 rows=3D9 = width=3D0) > Index Cond: (u =3D '00000000-0000-0000-0000-00000000= 0000'::uuid) > -> Bitmap Index Scan on idx (cost=3D0.00..1.07 rows=3D9 = width=3D0) > Index Cond: (u =3D '11111111-1111-1111-1111-11111111= 1111'::uuid) > (8 rows) I slightly revised the fix and added similar check to group_similar_or_args(). Could you, please, review that before commit? ------ Regards, Alexander Korotkov Supabase --0000000000009967ae062801f092 Content-Type: application/octet-stream; name="v3-0001-Skip-not-SOAP-supported-indexes-while-transformin.patch" Content-Disposition: attachment; filename="v3-0001-Skip-not-SOAP-supported-indexes-while-transformin.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m41zcrbv0 RnJvbSBiOWZjN2Q1MmViYjA1MWZlNWY2NzUwMTQwN2M1NmRhZjBhZjc2NWRhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogRnJpLCAyOSBOb3YgMjAyNCAwMTo0Njo0MyArMDIwMApTdWJqZWN0OiBb UEFUQ0ggdjNdIFNraXAgbm90IFNPQVAtc3VwcG9ydGVkIGluZGV4ZXMgd2hpbGUgdHJhbnNmb3Jt aW5nIGFuIE9SCiBjbGF1c2UgaW50byBTQU9QCgpUaGVyZSBpcyBubyBwb2ludCBpbiB0cmFuc2Zv cm1pbmcgT1ItY2xhdXNlcyBpbnRvIFNBT1AncyBpZiB0aGUgdGFyZ2V0IGluZGV4CmRvZXNuJ3Qg c3VwcG9ydCBTQU9QIHNjYW5zIGFueXdheS4gIFRoaXMgY29tbWl0IGFkZHMgY29ycmVzcG9uZGlu ZyBjaGVja3MKdG8gbWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2woKSBhbmQgZ3JvdXBfc2ltaWxh cl9vcl9hcmdzKCkuICBUaGUgZmlyc3QgY2hlY2sKZml4ZXMgdGhlIGFjdHVhbCBidWcsIHdoaWxl IHRoZSBzZWNvbmQganVzdCBzYXZlcyBzb21lIGN5Y2xlcy4KClJlcG9ydGVkLWJ5OiBBbGV4YW5k ZXIgTGFraGluCkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vODE3NGRlNjktOWUxYS0w ODI3LTBlODEtZWY5N2Y1NmE1OTM5JTQwZ21haWwuY29tCkF1dGhvcjogQWxlbmEgUnliYWtpbmEK UmV2aWV3ZWQtYnk6IFJhbmllciBWaWxlbGEsIEFsZXhhbmRlciBLb3JvdGtvdgotLS0KIHNyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgICAgICB8IDExICsrKysrKysrKy0tCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgfCAxOCArKysrKysrKysr KysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwgICAgICB8ICA2 ICsrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAzMyBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCmluZGV4IGQ4MjdmYzlmNGQ5Li42 NDBiMjhhNjhmYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBh dGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCkBAIC0xMzU0 LDggKzEzNTQsMTEgQEAgZ3JvdXBfc2ltaWxhcl9vcl9hcmdzKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsIFJlc3RyaWN0SW5mbyAqcmluZm8pCiAJCXsKIAkJCUluZGV4T3B0SW5m byAqaW5kZXggPSAoSW5kZXhPcHRJbmZvICopIGxmaXJzdChsYzIpOwogCi0JCQkvKiBJZ25vcmUg aW5kZXggaWYgaXQgZG9lc24ndCBzdXBwb3J0IGJpdG1hcCBzY2FucyAqLwotCQkJaWYgKCFpbmRl eC0+YW1oYXNnZXRiaXRtYXApCisJCQkvKgorCQkJICogSWdub3JlIGluZGV4IGlmIGl0IGRvZXNu J3Qgc3VwcG9ydCBiaXRtYXAgc2NhbnMgb3IgU0FPUAorCQkJICogY2xhdXNlcy4KKwkJCSAqLwor CQkJaWYgKCFpbmRleC0+YW1oYXNnZXRiaXRtYXAgfHwgIWluZGV4LT5hbXNlYXJjaGFycmF5KQog CQkJCWNvbnRpbnVlOwogCiAJCQlmb3IgKGNvbG51bSA9IDA7IGNvbG51bSA8IGluZGV4LT5ua2V5 Y29sdW1uczsgY29sbnVtKyspCkBAIC0zMjQ4LDYgKzMyNTEsMTAgQEAgbWF0Y2hfb3JjbGF1c2Vf dG9faW5kZXhjb2woUGxhbm5lckluZm8gKnJvb3QsCiAJQXNzZXJ0KElzQShvcmNsYXVzZSwgQm9v bEV4cHIpKTsKIAlBc3NlcnQob3JjbGF1c2UtPmJvb2xvcCA9PSBPUl9FWFBSKTsKIAorCS8qIEln bm9yZSBpbmRleCBpZiBpdCBkb2Vzbid0IHN1cHBvcnQgU0FPUCBjbGF1c2VzICovCisJaWYoIWlu ZGV4LT5hbXNlYXJjaGFycmF5KQorCQlyZXR1cm4gTlVMTDsKKwogCS8qCiAJICogVHJ5IHRvIGNv bnZlcnQgYSBsaXN0IG9mIE9SLWNsYXVzZXMgdG8gYSBzaW5nbGUgU0FPUCBleHByZXNzaW9uLiBF YWNoCiAJICogT1IgZW50cnkgbXVzdCBiZSBpbiB0aGUgZm9ybTogKGluZGV4a2V5IG9wZXJhdG9y IGNvbnN0YW50KSBvciAoY29uc3RhbnQKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRl X2luZGV4Lm91dAppbmRleCAxYjBhNWYwZTllMS4uMTkwNGViNjViYjkgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQKQEAgLTEyMzMsNiArMTIzMywyNCBAQCBT RUxFQ1QgY291bnQoKikgRlJPTSB0ZW5rMSBXSEVSRSBzdHJpbmd1MSA9ICdUVkFBQUEnOwogICAg IDE0CiAoMSByb3cpCiAKKy0tIE9SLWNsYXVzZXMgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkIGlu dG8gU0FPUCBiZWNhdXNlIGhhc2ggaW5kZXhlcyBkb24ndAorLS0gc3VwcG9ydCBTQU9QIHNjYW5z LgorU0VUIGVuYWJsZV9zZXFzY2FuID0gb2ZmOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU IENPVU5UKCopIEZST00gdGVuazEgV0hFUkUgc3RyaW5ndTEgPSAnVFZBQUFBJyBPUiAgc3RyaW5n dTEgPSAnVFZBQUFCJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiB0 ZW5rMQorICAgICAgICAgUmVjaGVjayBDb25kOiAoKHN0cmluZ3UxID0gJ1RWQUFBQSc6Om5hbWUp IE9SIChzdHJpbmd1MSA9ICdUVkFBQUInOjpuYW1lKSkKKyAgICAgICAgIC0+ICBCaXRtYXBPcgor ICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIGhhc2hfdHVwbGVzb3J0X2lk eAorICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHN0cmluZ3UxID0gJ1RWQUFBQSc6 Om5hbWUpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gaGFzaF90dXBs ZXNvcnRfaWR4CisgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoc3RyaW5ndTEgPSAn VFZBQUFCJzo6bmFtZSkKKyg4IHJvd3MpCisKK1JFU0VUIGVuYWJsZV9zZXFzY2FuOwogRFJPUCBJ TkRFWCBoYXNoX3R1cGxlc29ydF9pZHg7CiBSRVNFVCBtYWludGVuYW5jZV93b3JrX21lbTsKIC0t CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbAppbmRleCBkZGQwZDlhZDM5Ni4uYzA4 NWUwNWYwNTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5z cWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbApAQCAtMzcyLDYg KzM3MiwxMiBAQCBDUkVBVEUgSU5ERVggaGFzaF90dXBsZXNvcnRfaWR4IE9OIHRlbmsxIFVTSU5H IGhhc2ggKHN0cmluZ3UxIG5hbWVfb3BzKSBXSVRIIChmaQogRVhQTEFJTiAoQ09TVFMgT0ZGKQog U0VMRUNUIGNvdW50KCopIEZST00gdGVuazEgV0hFUkUgc3RyaW5ndTEgPSAnVFZBQUFBJzsKIFNF TEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxIFdIRVJFIHN0cmluZ3UxID0gJ1RWQUFBQSc7CistLSBP Ui1jbGF1c2VzIHNob3VsZG4ndCBiZSB0cmFuc2Zvcm1lZCBpbnRvIFNBT1AgYmVjYXVzZSBoYXNo IGluZGV4ZXMgZG9uJ3QKKy0tIHN1cHBvcnQgU0FPUCBzY2Fucy4KK1NFVCBlbmFibGVfc2Vxc2Nh biA9IG9mZjsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHRlbmsx IFdIRVJFIHN0cmluZ3UxID0gJ1RWQUFBQScgT1IgIHN0cmluZ3UxID0gJ1RWQUFBQic7CitSRVNF VCBlbmFibGVfc2Vxc2NhbjsKIERST1AgSU5ERVggaGFzaF90dXBsZXNvcnRfaWR4OwogUkVTRVQg bWFpbnRlbmFuY2Vfd29ya19tZW07CiAKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --0000000000009967ae062801f092--