From 6b8e0a610556cc01680b30c683562772922dc00d Mon Sep 17 00:00:00 2001 From: Nils Dijk Date: Thu, 7 May 2020 19:08:47 +0200 Subject: [PATCH] fix subtle bug in adding to a list we are iterating over --- .../distributed/planner/path_based_planner.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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); + } } /*