mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
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
This commit is contained in:
@@ -79,34 +79,6 @@ tlist_member(Expr *node, List *targetlist)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* tlist_member_ignore_relabel
|
||||
* Same as above, except that we ignore top-level RelabelType nodes
|
||||
* while checking for a match. This is needed for some scenarios
|
||||
* involving binary-compatible sort operations.
|
||||
*/
|
||||
TargetEntry *
|
||||
tlist_member_ignore_relabel(Expr *node, List *targetlist)
|
||||
{
|
||||
ListCell *temp;
|
||||
|
||||
while (node && IsA(node, RelabelType))
|
||||
node = ((RelabelType *) node)->arg;
|
||||
|
||||
foreach(temp, targetlist)
|
||||
{
|
||||
TargetEntry *tlentry = (TargetEntry *) lfirst(temp);
|
||||
Expr *tlexpr = tlentry->expr;
|
||||
|
||||
while (tlexpr && IsA(tlexpr, RelabelType))
|
||||
tlexpr = ((RelabelType *) tlexpr)->arg;
|
||||
|
||||
if (equal(node, tlexpr))
|
||||
return tlentry;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* tlist_member_match_var
|
||||
* Same as above, except that we match the provided Var on the basis
|
||||
|
Reference in New Issue
Block a user