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 1tGvpS-001qvV-S0 for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2024 07:54:19 +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 1tGvpQ-0054Pq-D9 for pgsql-hackers@arkaria.postgresql.org; Fri, 29 Nov 2024 07:54:17 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGvpQ-0054Pa-2F for pgsql-hackers@lists.postgresql.org; Fri, 29 Nov 2024 07:54:17 +0000 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tGvpP-000767-21 for pgsql-hackers@lists.postgresql.org; Fri, 29 Nov 2024 07:54:16 +0000 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-a9e44654ae3so176981366b.1 for ; Thu, 28 Nov 2024 23:54:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732866853; x=1733471653; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=i6tNjxQosmvlI1OGSCkPbG8POZmCBGeG/2snoDDmVmI=; b=JQr7yInCUw405RZOfL4SEw0oLi+cMfE0Acqhe8BcclN3aYbK1AUghqIkHye7Bn5L2i j93QaQJ/xwX3UDMQjZ4WvN/5syLhUH4ylflOYrq1DjrS5xbVcichSoEbX59fI+iy+SvH YiEW1Y+7DOocgOi17MF/ijKP8qhv+n4Evgrpeu79YpMRLYc3+gkVdG5rRC+YWWQEf7RI WcAXiYtVwuYbgITINqI0MviKCborpqTZwv8zAg5NIELR7wTA9tyFYgcpStmKqs72aI7F LVbt/a4N5TKNGCKniq1/5N5db3EXpkg/AEcFFKXMlazT4Jcdl812TJxaBt2XjI1wfAdz RVJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732866853; x=1733471653; h=content-transfer-encoding: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=i6tNjxQosmvlI1OGSCkPbG8POZmCBGeG/2snoDDmVmI=; b=fIxVYfF1Ym9O+DqhJnSXQ8azagv6aeFdRUjAea+j8REff/k8+7vS92Amz0+6qSO5k5 4YA7QC2uv//9SQ0yUHeTqXpEoybEyDtxNv6ejI1Ucwm7YY/J2MMFyqVAwu4irE8SiWHH iOTzIX23mdOksXsDK3sHEzyT6NAWxOFH5wBufySRYU/Vt6xm1BEkIJk+P0GNBWuVzmvL oJtXcC/93UCdy2vdm+wyuyd0NNH+YiNHnbu0CwCuJ0vC5bS7Cu3IHt2mFN5cR4EjaBJo VQ12R2BCcpbAp0mjWKDJJKxkRJAHuBcKaCfxlWc6Reb9Tv0FRQ0bNflgILE8y5tm+a2y 3I1A== X-Forwarded-Encrypted: i=1; AJvYcCX7gaUS/l+U8P7SAXFkSxzurUHADkS80sezEvakqAWtApHiejAv1/ExfL+rlwJJ3tosXWtxxRMkKvScSPO6@lists.postgresql.org X-Gm-Message-State: AOJu0YydHFIuDEAOHRIpE50mBpC6UT5GdXBa6BZCtbXmgnRUyZC73NcQ obndqY8I3xP6I7ROOMjmiRtf5B7lPwyRNSRZSE9U33Z9+0NU5DtFAc0ofD5P8mTJmb6jRxpQEc8 3ZDe3mxE73iNU2Heo0z/DwkM6i3w= X-Gm-Gg: ASbGncuN1IPcEYM+qiWEyNcO1mU10IpkVr55zjBzmahrFaOPXE1rVavIdcGyNalSmHa 743MCrOmPWAH9nQM3Kb2nAVB7T8kJkog= X-Google-Smtp-Source: AGHT+IH5rSwCY9psARAhjVyliJ9K3nhs4sMTsGsgPZ5Lc168jj4DwqimpfM8Jwi2YdO+tOCGl5aFuCZ5szrKtVJj0kg= X-Received: by 2002:a17:906:4c2:b0:aa5:1dc0:932e with SMTP id a640c23a62f3a-aa580f53e51mr751781866b.27.1732866853205; Thu, 28 Nov 2024 23:54:13 -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> <43db6a40-5c5f-4909-ad62-3060b297e686@postgrespro.ru> In-Reply-To: <43db6a40-5c5f-4909-ad62-3060b297e686@postgrespro.ru> From: Alexander Korotkov Date: Fri, 29 Nov 2024 09:54:02 +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: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Fri, Nov 29, 2024 at 7:51=E2=80=AFAM Alena Rybakina wrote: > > On 29.11.2024 03:04, Alexander Korotkov wrote: > > 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 '000000000000000000000000000000= 00' 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 useles= s? > >> Maybe moving your fix to the beginning of the function? > >> > >> diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optim= izer/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 (co= nstant > >> > >> The test bug: > >> EXPLAIN SELECT COUNT(*) FROM tbl WHERE u =3D '000000000000000000000000= 00000000' OR u =3D '11111111111111111111111111111111'; > >> QUERY PLA= N > >> ----------------------------------------------------------------------= ------------------------------------------------------------ > >> 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'= ::uuid) 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-0000= 00000000'::uuid) > >> -> Bitmap Index Scan on idx (cost=3D0.00..1.07 rows= =3D9 width=3D0) > >> Index Cond: (u =3D '11111111-1111-1111-1111-1111= 11111111'::uuid) > >> (8 rows) > > I slightly revised the fix and added similar check to > > group_similar_or_args(). Could you, please, review that before > > commit? > > > I agree with changes. Thank you! Andrei, Alena, thank you for the feedback. Pushed! ------ Regards, Alexander Korotkov Supabase