Re: queryId constant squashing does not support prepared statements - Mailing list pgsql-hackers

From Dmitry Dolgov
Subject Re: queryId constant squashing does not support prepared statements
Date
Msg-id psu4ljnr4mfi6d5vafbm7dntadprwriaqakvm7pymjcodtqdef@legqifcenpvr
Whole thread Raw
In response to Re: queryId constant squashing does not support prepared statements  (Sami Imseih <samimseih@gmail.com>)
List pgsql-hackers
> On Fri, May 23, 2025 at 09:05:54AM GMT, Sami Imseih wrote:
> > > On Thu, May 22, 2025 at 10:23:31PM GMT, Sami Imseih wrote:
> > > > This does not get squashed:
> > > > Q: select where 2 in (1, 4) and
> > > > 1 in (5, cast(7 as int), 6, (cast(8 as int)), 9, 10, (cast(8 as text))::int);
> > > > R: select where $1 in ($2 /*, ... */) and
> > > > $3 in ($4, cast($5 as int), $6, (cast($7 as int)), $8, $9, (cast($10 as text))::int)
> > >
> > > This is interesting actually. This is the behavior on HEAD, and I don't get why
> > > the first list with the casts does not get squashed, while the second one does.
> > > I will check IsSquashableConst tomorrow unless Dmitry gets to it first.
> >
> > IsSquashableConst has intentionally a limited set of test for
> > "constantness", in particular it does not recurse. The case above
> >
> >     (cast(8 as text))::int
> >
> > features two CoerceViaIO expressions one inside another, hence
> > IsSquashableConst returns false.
>
> Should we be doing something like this? to unwrap RelabelType or
> CoerceViaIO until we have a different type of node to check
> for later on. We can guard the loop and break out after x amount
> of times as well. At minimum, we should try to unwrap at least
> 2 times for some of the common real-world scenarios.
>
> What do you think?
>
> ```
> while (IsA(element, RelabelType) || IsA(element, CoerceViaIO))
> {
>        if (IsA(element, RelabelType))
>            element = (Node *) ((RelabelType *) element)->arg;
>        else if (IsA(element, CoerceViaIO))
>             element = (Node *) ((CoerceViaIO *) element)->arg;
> }
> ```

I think it's better to recursively call IsSquashableConst on the nested
expression (arg or args for FuncExpr). Something like that was done in
the original patch version and was concidered too much at that time, but
since it looks like all the past concerns are lifted, why not. Do not
forget check_stack_depth.



pgsql-hackers by date:

Previous
From: Shaik Mohammad Mujeeb
Date:
Subject: Re: [Util] Warn and Remove Invalid GUCs
Next
From: Maxim Orlov
Date:
Subject: Re: Add 64-bit XIDs into PostgreSQL 15