Hmm, I missed that other thread. That indeed seems like a bug in the same area already tweaked by ebb7ae839d033d0f2 for similar cases.
The attached patch fixes this simply by adding is_parallel_safe to get_useful_pathkeys_for_relation - that does fix the reproducer, but I'm not entirely sure that's the right place. Maybe it should be done in find_em_expr_usable_for_sorting_rel (which might make a difference if an EC clause can contain a mix of parallel safe and unsafe expressions). Or maybe we should do it in the caller (which would allow using get_useful_pathkeys_for_relation in contexts not requiring parallel safety in the future). Anyway, while this is not an "incremental sort" bug, it seems like the root cause is the same as for ebb7ae839d033d0f2 - one of the incremental sort patches started considering sorting below gather nodes, not realizing these possible consequences. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 84a69b064a..93db261011 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -2826,6 +2826,7 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) foreach(lc, root->query_pathkeys) { + Expr *expr; PathKey *pathkey = (PathKey *) lfirst(lc); EquivalenceClass *pathkey_ec = pathkey->pk_eclass; @@ -2840,7 +2841,14 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) * enable not just an incremental sort on the entirety of * query_pathkeys but also incremental sort below a JOIN. */ - if (!find_em_expr_usable_for_sorting_rel(pathkey_ec, rel)) + if (!(expr = find_em_expr_usable_for_sorting_rel(pathkey_ec, rel))) + break; + + /* + * Also stop when the expression is not parallel-safe. We plan + * to add all of this under a Gather node. + */ + if (!is_parallel_safe(root, (Node *) expr)) break; npathkeys++;