diff options
| author | Tom Lane | 2021-04-20 15:32:02 +0000 |
|---|---|---|
| committer | Tom Lane | 2021-04-20 15:32:02 +0000 |
| commit | 375398244168add84a884347625d14581a421e71 (patch) | |
| tree | 2d4e63dd53b05c82c2847a04918a9c82f4088b54 /src/include/optimizer | |
| parent | 95c3a1956ec9eac686c1b69b033dd79211b72343 (diff) | |
Fix planner failure in some cases of sorting by an aggregate.
An oversight introduced by the incremental-sort patches caused
"could not find pathkey item to sort" errors in some situations
where a sort key involves an aggregate or window function.
The basic problem here is that find_em_expr_usable_for_sorting_rel
isn't properly modeling what prepare_sort_from_pathkeys will do
later. Rather than hoping we can keep those functions in sync,
let's refactor so that they actually share the code for
identifying a suitable sort expression.
With this refactoring, tlist.c's tlist_member_ignore_relabel
is unused. I removed it in HEAD but left it in place in v13,
in case any extensions are using it.
Per report from Luc Vlaming. Back-patch to v13 where the
problem arose.
James Coleman and Tom Lane
Discussion: https://postgr.es/m/91f3ec99-85a4-fa55-ea74-33f85a5c651f@swarm64.com
Diffstat (limited to 'src/include/optimizer')
| -rw-r--r-- | src/include/optimizer/paths.h | 8 | ||||
| -rw-r--r-- | src/include/optimizer/tlist.h | 1 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 035d3e1206..888e85ff5b 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -135,6 +135,14 @@ extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root, Index sortref, Relids rel, bool create_it); +extern EquivalenceMember *find_ec_member_matching_expr(EquivalenceClass *ec, + Expr *expr, + Relids relids); +extern EquivalenceMember *find_computable_ec_member(PlannerInfo *root, + EquivalenceClass *ec, + List *exprs, + Relids relids, + bool require_parallel_safe); extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel); extern Expr *find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec, diff --git a/src/include/optimizer/tlist.h b/src/include/optimizer/tlist.h index e081ef2d5e..d62a09665a 100644 --- a/src/include/optimizer/tlist.h +++ b/src/include/optimizer/tlist.h @@ -18,7 +18,6 @@ extern TargetEntry *tlist_member(Expr *node, List *targetlist); -extern TargetEntry *tlist_member_ignore_relabel(Expr *node, List *targetlist); extern List *add_to_flat_tlist(List *tlist, List *exprs); |
