Thread

Commits

  1. Allow pushdown of HAVING clauses with grouping sets

  1. Allow pushdown of HAVING clauses with grouping sets

    Richard Guo <guofenglinux@gmail.com> — 2024-09-11T03:43:47Z

    In some cases, we may want to transfer a HAVING clause into WHERE in
    hopes of eliminating tuples before aggregation instead of after.
    
    Previously, we couldn't do this if there were any nonempty grouping
    sets, because we didn't have a way to tell if the HAVING clause
    referenced any columns that were nullable by the grouping sets, and
    moving such a clause into WHERE could potentially change the results.
    
    Now, with expressions marked nullable by grouping sets with the RT
    index of the RTE_GROUP RTE, it is much easier to identify those
    clauses that reference any nullable-by-grouping-sets columns: we just
    need to check if the RT index of the RTE_GROUP RTE is present in the
    clause.  For other HAVING clauses, they can be safely pushed down.
    
    I'm not sure how common it is in practice to have a HAVING clause
    where all referenced columns are present in all the grouping sets.
    But it seems to me that this optimization doesn't cost too much.  Not
    implementing it seems like leaving money on the table.
    
    Any thoughts?
    
    Thanks
    Richard
    
  2. Re: Allow pushdown of HAVING clauses with grouping sets

    Richard Guo <guofenglinux@gmail.com> — 2024-10-10T02:23:23Z

    On Wed, Sep 11, 2024 at 11:43 AM Richard Guo <guofenglinux@gmail.com> wrote:
    > In some cases, we may want to transfer a HAVING clause into WHERE in
    > hopes of eliminating tuples before aggregation instead of after.
    >
    > Previously, we couldn't do this if there were any nonempty grouping
    > sets, because we didn't have a way to tell if the HAVING clause
    > referenced any columns that were nullable by the grouping sets, and
    > moving such a clause into WHERE could potentially change the results.
    >
    > Now, with expressions marked nullable by grouping sets with the RT
    > index of the RTE_GROUP RTE, it is much easier to identify those
    > clauses that reference any nullable-by-grouping-sets columns: we just
    > need to check if the RT index of the RTE_GROUP RTE is present in the
    > clause.  For other HAVING clauses, they can be safely pushed down.
    >
    > I'm not sure how common it is in practice to have a HAVING clause
    > where all referenced columns are present in all the grouping sets.
    > But it seems to me that this optimization doesn't cost too much.  Not
    > implementing it seems like leaving money on the table.
    
    I've gone ahead and pushed this.
    
    Thanks
    Richard