diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 10 | ||||
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 8 | ||||
-rw-r--r-- | src/include/optimizer/planmain.h | 2 |
3 files changed, 20 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index b65cb0bfe2..e68d7cf270 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -2499,6 +2499,7 @@ create_remotequery_plan(PlannerInfo *root, Path *best_path, Datum distcol_value; bool distcol_isnull; Oid distcol_type; + Node *tmp_node; Assert(scan_relid > 0); Assert(best_path->parent->rtekind == RTE_RELATION); @@ -2566,6 +2567,15 @@ create_remotequery_plan(PlannerInfo *root, Path *best_path, } list_free(varlist); + /* + * Call fix_scan_expr to fix the PlaceHolderVars. This step is not needed if + * we construct the query at the time of execution. + */ + tmp_node = pgxc_fix_scan_expr(root->glob, (Node *)query->targetList, 0); + Assert(IsA(tmp_node, List)); + query->targetList = (List *)tmp_node; + tmp_node = pgxc_fix_scan_expr(root->glob, (Node *)query->jointree->quals, 0); + query->jointree->quals = tmp_node; initStringInfo(&sql); deparse_query(query, &sql, NIL); diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 68981d339d..a9c1153977 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -2019,3 +2019,11 @@ set_remote_references(PlannerGlobal *glob, RemoteQuery *rscan, int rtoffset) pfree(base_itlist); } + +#ifdef PGXC +Node * +pgxc_fix_scan_expr(PlannerGlobal *glob, Node *node, int rtoffset) +{ + return fix_scan_expr(glob, node, rtoffset); +} +#endif /* PGXC */ diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index e30b348ae4..3f9b6b681a 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -140,6 +140,8 @@ extern Plan *create_remoteinsert_plan(PlannerInfo *root, Plan *topplan); extern Plan *create_remoteupdate_plan(PlannerInfo *root, Plan *topplan); extern Plan *create_remotedelete_plan(PlannerInfo *root, Plan *topplan); extern Plan *create_remotegrouping_plan(PlannerInfo *root, Plan *local_plan); +/* Expose fix_scan_expr to create_remotequery_plan() */ +extern Node *pgxc_fix_scan_expr(PlannerGlobal *glob, Node *node, int rtoffset); #endif #endif /* PLANMAIN_H */ |