Il giorno ven 19 giu 2026 alle ore 08:43 Richard Guo <[email protected]>
ha scritto:

> On Fri, Jun 19, 2026 at 12:34 AM Florin Irion <[email protected]> wrote:
> > When an outer qual is pushed into a GROUP BY subquery it lands in
> havingQual (correct), but find_having_conflicts then misses the conflict
> because the pushed qual carries base-table Vars, not GROUP Vars — so the
> clause gets silently moved to WHERE, filtering before aggregation.
>
> I don't think so.  The pushed qual carries the GROUP Vars, not the
> base-table Vars.
>
> > Reproducer:
> > ```
> >   CREATE TYPE t_rec AS (x numeric);
> >   CREATE TABLE t_grp (a t_rec);
> >   INSERT INTO t_grp VALUES (ROW(1.0)), (ROW(1.00)), (ROW(2));
> >
> >   -- record_ops (default) considers 1.0 and 1.00 equal; record_image_ops
> does not.
> >   -- Expected: one row (1.0), count = 2
> >   -- Got:      one row (1.0), count = 1  (wrong)
> >   SELECT * FROM (SELECT a, count(*) FROM t_grp GROUP BY a) s
> >   WHERE a *= ROW(1.0)::t_rec;
> > ```
>
> I ran your reproducer, and I got the Expected result:
>
> SELECT * FROM (SELECT a, count(*) FROM t_grp GROUP BY a) s
>   WHERE a *= ROW(1.0)::t_rec;
>    a   | count
> -------+-------
>  (1.0) |     2
> (1 row)
>
> Curious how you got the wrong result with this patch.
>
> > EXPLAIN shows the *= filter pushed inside the aggregate scan rather than
> sitting above it as a Subquery Scan filter.
>
> Here is the EXPLAIN I got:
>
> EXPLAIN (COSTS OFF)
> SELECT * FROM (SELECT a, count(*) FROM t_grp GROUP BY a) s
>   WHERE a *= ROW(1.0)::t_rec;
>               QUERY PLAN
> ---------------------------------------
>  HashAggregate
>    Group Key: t_grp.a
>    Filter: (t_grp.a *= '(1.0)'::t_rec)
>    ->  Seq Scan on t_grp
> (4 rows)
>
> So the filter stays in HAVING instead of being pushed to Scan, which
> is expected.  I wonder how you get a plan with the filter being pushed
> to scan.  Can you show your output of EXPLAIN?
>
> - Richard
>

Huh, I'm not able to reproduce it anymore either,
probably while reviewing it, I played a bit with some things and this test
was using some bogus install.
Sorry for the noise.


Cheers,
Florin

-- 
    * Florin Irion  *
*    https://www.enterprisedb.com <https://www.enterprisedb.com/>*

Reply via email to