mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Fix get_useful_pathkeys_for_relation for volatile expressions
When considering Incremental Sort below a Gather Merge, we need to be a bit more careful when matching pathkeys to EC members. It's not enough to find a member whose Vars are all in the current relation's target; volatile expressions in particular need to be contained in the target, otherwise it's too early to use the pathkey. Reported-by: Jaime Casanova Author: James Coleman Reviewed-by: Tomas Vondra Backpatch-through: 13, where the incremental sort code was added Discussion: https://postgr.es/m/CAJGNTeNaxpXgBVcRhJX%2B2vSbq%2BF2kJqGBcvompmpvXb7pq%2BoFA%40mail.gmail.com
This commit is contained in:
@@ -2816,7 +2816,8 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
|
||||
/*
|
||||
* Considering query_pathkeys is always worth it, because it might allow
|
||||
* us to avoid a total sort when we have a partially presorted path
|
||||
* available.
|
||||
* available or to push the total sort into the parallel portion of the
|
||||
* query.
|
||||
*/
|
||||
if (root->query_pathkeys)
|
||||
{
|
||||
@@ -2829,17 +2830,17 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
|
||||
EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
|
||||
|
||||
/*
|
||||
* We can only build an Incremental Sort for pathkeys which
|
||||
* contain an EC member in the current relation, so ignore any
|
||||
* suffix of the list as soon as we find a pathkey without an EC
|
||||
* member the relation.
|
||||
* We can only build a sort for pathkeys which contain an EC
|
||||
* member in the current relation's target, so ignore any suffix
|
||||
* of the list as soon as we find a pathkey without an EC member
|
||||
* in the relation.
|
||||
*
|
||||
* By still returning the prefix of the pathkeys list that does
|
||||
* meet criteria of EC membership in the current relation, we
|
||||
* enable not just an incremental sort on the entirety of
|
||||
* query_pathkeys but also incremental sort below a JOIN.
|
||||
*/
|
||||
if (!find_em_expr_for_rel(pathkey_ec, rel))
|
||||
if (!find_em_expr_usable_for_sorting_rel(pathkey_ec, rel))
|
||||
break;
|
||||
|
||||
npathkeys++;
|
||||
|
||||
Reference in New Issue
Block a user