@@ -961,18 +961,21 @@ find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel)
961
961
}
962
962
963
963
/*
964
- * Find an equivalence class member expression that can be used to build
965
- * a sort node using the provided relation; return NULL if no candidate.
964
+ * relation_can_be_sorted_early
965
+ * Can this relation be sorted on this EC before the final output step?
966
966
*
967
967
* To succeed, we must find an EC member that prepare_sort_from_pathkeys knows
968
968
* how to sort on, given the rel's reltarget as input. There are also a few
969
969
* additional constraints based on the fact that the desired sort will be done
970
- * within the scan/join part of the plan. Also, non-parallel-safe expressions
971
- * are ignored if 'require_parallel_safe'.
970
+ * "early", within the scan/join part of the plan. Also, non-parallel-safe
971
+ * expressions are ignored if 'require_parallel_safe'.
972
+ *
973
+ * At some point we might want to return the identified EquivalenceMember,
974
+ * but for now, callers only want to know if there is one.
972
975
*/
973
- Expr *
974
- find_em_expr_usable_for_sorting_rel (PlannerInfo * root , EquivalenceClass * ec ,
975
- RelOptInfo * rel , bool require_parallel_safe )
976
+ bool
977
+ relation_can_be_sorted_early (PlannerInfo * root , RelOptInfo * rel ,
978
+ EquivalenceClass * ec , bool require_parallel_safe )
976
979
{
977
980
PathTarget * target = rel -> reltarget ;
978
981
EquivalenceMember * em ;
@@ -982,7 +985,7 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
982
985
* Reject volatile ECs immediately; such sorts must always be postponed.
983
986
*/
984
987
if (ec -> ec_has_volatile )
985
- return NULL ;
988
+ return false ;
986
989
987
990
/*
988
991
* Try to find an EM directly matching some reltarget member.
@@ -1012,7 +1015,7 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
1012
1015
!is_parallel_safe (root , (Node * ) em -> em_expr ))
1013
1016
continue ;
1014
1017
1015
- return em -> em_expr ;
1018
+ return true ;
1016
1019
}
1017
1020
1018
1021
/*
@@ -1021,7 +1024,7 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
1021
1024
em = find_computable_ec_member (root , ec , target -> exprs , rel -> relids ,
1022
1025
require_parallel_safe );
1023
1026
if (!em )
1024
- return NULL ;
1027
+ return false ;
1025
1028
1026
1029
/*
1027
1030
* Reject expressions involving set-returning functions, as those can't be
@@ -1030,9 +1033,9 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
1030
1033
* belong to multi-member ECs.)
1031
1034
*/
1032
1035
if (IS_SRF_CALL ((Node * ) em -> em_expr ))
1033
- return NULL ;
1036
+ return false ;
1034
1037
1035
- return em -> em_expr ;
1038
+ return true ;
1036
1039
}
1037
1040
1038
1041
/*
0 commit comments