diff --git a/src/backend/distributed/planner/path_based_planner.c b/src/backend/distributed/planner/path_based_planner.c index 5cbd58ada..8dad7612e 100644 --- a/src/backend/distributed/planner/path_based_planner.c +++ b/src/backend/distributed/planner/path_based_planner.c @@ -383,6 +383,13 @@ PathBasedPlannerJoinHook(PlannerInfo *root, JoinType jointype, JoinPathExtraData *extra) { + /* + * Adding a path to a list includes lappend which might be destructive. Since we are + * looping over the paths we are adding to we should keep a list of new paths to add + * and only add them after we have found all the paths we want to add. + */ + List *newPaths = NIL; + if (jointype == JOIN_INNER) { ListCell *pathCell = NULL; @@ -392,10 +399,16 @@ PathBasedPlannerJoinHook(PlannerInfo *root, Path *optimizedPath = OptimizeJoinPath(originalPath); if (optimizedPath) { - add_path(joinrel, optimizedPath); + newPaths = lappend(newPaths, optimizedPath); } } } + + Path *path = NULL; + foreach_ptr(path, newPaths) + { + add_path(joinrel, path); + } } /*