Fix a bug where queries would incorrectly get executed on the coordinator.
authorPavan Deolasee <[email protected]>
Fri, 29 Jan 2016 09:16:10 +0000 (14:46 +0530)
committerPavan Deolasee <[email protected]>
Tue, 18 Oct 2016 09:48:13 +0000 (15:18 +0530)
Report by Krzysztof Nienartowicz, patch by me.

src/backend/optimizer/plan/createplan.c

index acb603f4de7cfd0ae623d23d2ca6b1a454360020..4d437e3a6dc2a37c791b09b019e24bcb586bf0ed 100644 (file)
@@ -1276,13 +1276,13 @@ create_remotescan_plan(PlannerInfo *root,
 
 
 static RemoteSubplan *
-find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent)
+find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, bool delete, Plan **parent)
 {
        if (IsA(plan, RemoteSubplan) &&
                        (force || (list_length(((RemoteSubplan *) plan)->nodeList) > 1 &&
                                           ((RemoteSubplan *) plan)->execOnAll)))
        {
-               if (parent)
+               if (delete && (parent))
                        *parent = plan->lefttree;
                return (RemoteSubplan *) plan;
        }
@@ -1291,7 +1291,7 @@ find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent
                        IsA(plan, Material) ||
                        IsA(plan, Unique) ||
                        IsA(plan, Limit))
-               return find_push_down_plan_int(root, plan->lefttree, force, &plan->lefttree);
+               return find_push_down_plan_int(root, plan->lefttree, force, delete, &plan->lefttree);
 
        /*
         * If its a subquery scan and we are looking to replace RemoteSubplan then
@@ -1300,7 +1300,8 @@ find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent
        if (parent && IsA(plan, SubqueryScan))
        {
                Plan *subplan = ((SubqueryScan *)plan)->subplan;
-               RemoteSubplan *remote_plan = find_push_down_plan_int(root, ((SubqueryScan *)plan)->subplan, force,
+               RemoteSubplan *remote_plan = find_push_down_plan_int(root,
+                               ((SubqueryScan *)plan)->subplan, force, delete,
                                &((SubqueryScan *)plan)->subplan);
 
                /*
@@ -1322,7 +1323,7 @@ find_push_down_plan_int(PlannerInfo *root, Plan *plan, bool force, Plan **parent
 RemoteSubplan *
 find_push_down_plan(Plan *plan, bool force)
 {
-       return find_push_down_plan_int(NULL, plan, force, NULL);
+       return find_push_down_plan_int(NULL, plan, force, false, NULL);
 }
 
 RemoteSubplan *
@@ -1331,7 +1332,7 @@ find_delete_push_down_plan(PlannerInfo *root,
                bool force,
                Plan **parent)
 {
-       return find_push_down_plan_int(root, plan, force, parent);
+       return find_push_down_plan_int(root, plan, force, true, parent);
 }
 #endif