diff options
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index f812c939794..7bddf33e5c8 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.250 2008/10/07 19:27:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.251 2008/10/21 20:42:53 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -37,7 +37,7 @@ static Plan *create_scan_plan(PlannerInfo *root, Path *best_path); static List *build_relation_tlist(RelOptInfo *rel); -static bool use_physical_tlist(RelOptInfo *rel); +static bool use_physical_tlist(PlannerInfo *root, RelOptInfo *rel); static void disuse_physical_tlist(Plan *plan, Path *path); static Plan *create_gating_plan(PlannerInfo *root, Plan *plan, List *quals); static Plan *create_join_plan(PlannerInfo *root, JoinPath *best_path); @@ -212,7 +212,7 @@ create_scan_plan(PlannerInfo *root, Path *best_path) * planner.c may replace the tlist we generate here, forcing projection to * occur.) */ - if (use_physical_tlist(rel)) + if (use_physical_tlist(root, rel)) { tlist = build_physical_tlist(root, rel); /* if fail because of dropped cols, use regular method */ @@ -325,9 +325,9 @@ build_relation_tlist(RelOptInfo *rel) foreach(v, rel->reltargetlist) { /* Do we really need to copy here? Not sure */ - Var *var = (Var *) copyObject(lfirst(v)); + Node *node = (Node *) copyObject(lfirst(v)); - tlist = lappend(tlist, makeTargetEntry((Expr *) var, + tlist = lappend(tlist, makeTargetEntry((Expr *) node, resno, NULL, false)); @@ -342,9 +342,10 @@ build_relation_tlist(RelOptInfo *rel) * rather than only those Vars actually referenced. */ static bool -use_physical_tlist(RelOptInfo *rel) +use_physical_tlist(PlannerInfo *root, RelOptInfo *rel) { int i; + ListCell *lc; /* * We can do this for real relation scans, subquery scans, function scans, @@ -365,9 +366,9 @@ use_physical_tlist(RelOptInfo *rel) return false; /* - * Can't do it if any system columns or whole-row Vars are requested, - * either. (This could possibly be fixed but would take some fragile - * assumptions in setrefs.c, I think.) + * Can't do it if any system columns or whole-row Vars are requested. + * (This could possibly be fixed but would take some fragile assumptions + * in setrefs.c, I think.) */ for (i = rel->min_attr; i <= 0; i++) { @@ -375,6 +376,19 @@ use_physical_tlist(RelOptInfo *rel) return false; } + /* + * Can't do it if the rel is required to emit any placeholder expressions, + * either. + */ + foreach(lc, root->placeholder_list) + { + PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(lc); + + if (bms_nonempty_difference(phinfo->ph_needed, rel->relids) && + bms_is_subset(phinfo->ph_eval_at, rel->relids)) + return false; + } + return true; } @@ -2925,7 +2939,7 @@ make_sort_from_pathkeys(PlannerInfo *root, Plan *lefttree, List *pathkeys, if (em->em_is_const || em->em_is_child) continue; sortexpr = em->em_expr; - exprvars = pull_var_clause((Node *) sortexpr, false); + exprvars = pull_var_clause((Node *) sortexpr, true); foreach(k, exprvars) { if (!tlist_member_ignore_relabel(lfirst(k), tlist)) |