diff options
Diffstat (limited to 'src/backend/optimizer/util/placeholder.c')
| -rw-r--r-- | src/backend/optimizer/util/placeholder.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/backend/optimizer/util/placeholder.c b/src/backend/optimizer/util/placeholder.c index 0184e6d36c..8a114fe946 100644 --- a/src/backend/optimizer/util/placeholder.c +++ b/src/backend/optimizer/util/placeholder.c @@ -52,8 +52,8 @@ make_placeholder_expr(PlannerInfo *root, Expr *expr, Relids phrels) * find_placeholder_info * Fetch the PlaceHolderInfo for the given PHV * - * If the PlaceHolderInfo doesn't exist yet, create it if create_new_ph is - * true, else throw an error. + * If the PlaceHolderInfo doesn't exist yet, create it if we haven't yet + * frozen the set of PlaceHolderInfos for the query; else throw an error. * * This is separate from make_placeholder_expr because subquery pullup has * to make PlaceHolderVars for expressions that might not be used at all in @@ -61,13 +61,10 @@ make_placeholder_expr(PlannerInfo *root, Expr *expr, Relids phrels) * We build PlaceHolderInfos only for PHVs that are still present in the * simplified query passed to query_planner(). * - * Note: this should only be called after query_planner() has started. Also, - * create_new_ph must not be true after deconstruct_jointree begins, because - * make_outerjoininfo assumes that we already know about all placeholders. + * Note: this should only be called after query_planner() has started. */ PlaceHolderInfo * -find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv, - bool create_new_ph) +find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv) { PlaceHolderInfo *phinfo; Relids rels_used; @@ -87,7 +84,7 @@ find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv, } /* Not found, so create it */ - if (!create_new_ph) + if (root->placeholdersFrozen) elog(ERROR, "too late to create a new PlaceHolderInfo"); phinfo = makeNode(PlaceHolderInfo); @@ -166,16 +163,13 @@ find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv, * * We don't need to look at the targetlist because build_base_rel_tlists() * will already have made entries for any PHVs in the tlist. - * - * This is called before we begin deconstruct_jointree. Once we begin - * deconstruct_jointree, all active placeholders must be present in - * root->placeholder_list, because make_outerjoininfo and - * update_placeholder_eval_levels require this info to be available - * while we crawl up the join tree. */ void find_placeholders_in_jointree(PlannerInfo *root) { + /* This must be done before freezing the set of PHIs */ + Assert(!root->placeholdersFrozen); + /* We need do nothing if the query contains no PlaceHolderVars */ if (root->glob->lastPHId != 0) { @@ -265,7 +259,7 @@ find_placeholders_in_expr(PlannerInfo *root, Node *expr) continue; /* Create a PlaceHolderInfo entry if there's not one already */ - (void) find_placeholder_info(root, phv, true); + (void) find_placeholder_info(root, phv); } list_free(vars); } @@ -392,7 +386,7 @@ fix_placeholder_input_needed_levels(PlannerInfo *root) PVC_RECURSE_WINDOWFUNCS | PVC_INCLUDE_PLACEHOLDERS); - add_vars_to_targetlist(root, vars, phinfo->ph_eval_at, false); + add_vars_to_targetlist(root, vars, phinfo->ph_eval_at); list_free(vars); } } |
