Re: Replace IN VALUES with ANY in WHERE clauses during optimization

From: Alexander Korotkov <aekorotkov(at)gmail(dot)com>
To: Alena Rybakina <a(dot)rybakina(at)postgrespro(dot)ru>
Cc: Andrei Lepikhov <lepihov(at)gmail(dot)com>, Ivan Kush <ivan(dot)kush(at)tantorlabs(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
Subject: Re: Replace IN VALUES with ANY in WHERE clauses during optimization
Date: 2025-02-09 15:38:03
Message-ID: CAPpHfdu6paqAt+6h90a5vS_AN3jNbY3h=iHxoOi=gyE5d1kvLA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Sun, Feb 9, 2025 at 1:58 PM Alexander Korotkov <aekorotkov(at)gmail(dot)com> wrote:
>
> On Thu, Jan 9, 2025 at 3:11 PM Alena Rybakina <a(dot)rybakina(at)postgrespro(dot)ru> wrote:
> > On 04.10.2024 12:05, Andrei Lepikhov wrote:
> > > We also have an implementation of VALUES -> ARRAY transformation.
> > > Because enterprises must deal with users' problems, many of these
> > > users employ automatically generated queries.
> > > Being informed very well of the consensus about that stuff, we've
> > > designed it as a library. But, looking into the code now, I see that
> > > it only needs a few cycles if no one 'x IN VALUES' expression is
> > > presented in the query. Who knows? It may be OK for the core.
> > > So, I've rewritten the code into the patch - see it in the attachment.
> > >
> > > The idea is quite simple - at the same place as
> > > convert_ANY_sublink_to_join, we can test the SubLink on proper VALUES
> > > RTE and perform the transformation if it's convertible.
> >
> > I updated the patch due to the problem with the coercion types for both
> > sides of the expression.
> >
> > We must find a common type for both leftop of the expression and rightop
> > including constants for correct transformation, and at the same time
> > check that the resulting types are compatible.
> >
> > To do this we find an operator for the two input types if it is
> > possible, and also remember the target types for the left and right
> > sides, and after that make a coercion.
> >
> > This processing is only needed in cases where we are not working with
> > parameters since the final type is not specified for the parameters.
>
> I took a look at this patch.
>
> + /* TODO: remember parameters */
>
> What was intended to do here?
>
> Also, aren't we too restrictive while requiring is_simple_values_sequence()?
> For instance, I believe cases like this (containing Var) could be transformed too.
>
> select * from t t1, lateral (select * from t t2 where t2.i in (values (t1.i), (1)));

Also, I think there is quite a code duplication about construction of
SAOP between match_orclause_to_indexcol() and convert_VALUES_to_ANY()
functions. I would like to see a refactoring as a separate first
patch, which extracts the common part into a function.

------
Regards,
Alexander Korotkov
Supabase

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrey Borodin 2025-02-09 17:07:17 Re: UUID v7
Previous Message Zhang Mingli 2025-02-09 15:14:51 Fix outdated code comments in nodeAgg.c