Re: Fix HAVING-to-WHERE pushdown with nondeterministic collations
Richard Guo <guofenglinux@gmail.com>
From: Richard Guo <guofenglinux@gmail.com>
To: wenhui qiu <qiuwenhuifx@gmail.com>
Cc: Pg Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-04-02T10:11:07Z
Lists: pgsql-hackers
On Wed, Apr 1, 2026 at 11:19 AM wenhui qiu <qiuwenhuifx@gmail.com> wrote:
> > + vars = pull_var_clause(node, PVC_RECURSE_PLACEHOLDERS);
> > +
> > + foreach_node(Var, var, vars)
> > + {
> > + if (var->varno == *group_rtindex &&
> > + OidIsValid(var->varcollid) &&
> > + var->varcollid != inputcollid &&
> > + !get_collation_isdeterministic(var->varcollid))
> > + {
> > + list_free(vars);
> > + return true;
> > + }
> > + }
> > +
> > + list_free(vars);
> This might be overthinking, but I wonder if calling pull_var_clause() at each walker step could introduce some overhead due to repeated subtree scans
That's a good point, but I doubt that it'd be an issue in practice.
HAVING clauses are typically very small expressions. Even in unusual
queries, the clause size is bounded by what a human writes, which is
negligible compared to the work the planner does elsewhere.
Maybe we can avoid this by calling pull_var_clause once at the top of
each clause and reusing that var list at every node. But that can
introduce false positives. The pre-pulled list contains all GROUP
Vars from the entire clause, but a given operator node only acts on
the vars in its own subtree.
- Richard
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix HAVING-to-WHERE pushdown for simple-CASE form
- 1132af22cf7d 18.4 landed
- ba82de48e62c 19 (unreleased) landed
-
Fix HAVING-to-WHERE pushdown with nondeterministic collations
- e8fd5e579223 18.4 landed
- f76686ce7f77 19 (unreleased) landed