diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-08-17 15:52:53 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-08-17 15:52:53 -0400 |
commit | b3ff6c742f6c7f750e9f74476576839cb039e1ab (patch) | |
tree | 958a48667e1d9172c496ecb100162c9e3876c1c6 /src/backend/optimizer/path | |
parent | 6569ca43973b754e8213072c8ddcae9e7baf2aaa (diff) | |
download | postgresql-b3ff6c742f6c7f750e9f74476576839cb039e1ab.tar.gz |
Use an explicit state flag to control PlaceHolderInfo creation.
Up to now, callers of find_placeholder_info() were required to pass
a flag indicating if it's OK to make a new PlaceHolderInfo. That'd
be fine if the callers had free choice, but they do not. Once we
begin deconstruct_jointree() it's no longer OK to make more PHIs;
while callers before that always want to create a PHI if it's not
there already. So there's no freedom of action, only the opportunity
to cause bugs by creating PHIs too late. Let's get rid of that in
favor of adding a state flag PlannerInfo.placeholdersFrozen, which
we can set at the point where it's no longer OK to make more PHIs.
This patch also simplifies a couple of call sites that were using
complicated logic to avoid calling find_placeholder_info() as much
as possible. Now that that lookup is O(1) thanks to the previous
commit, the extra bitmap manipulations are probably a net negative.
Discussion: https://postgr.es/m/1405792.1660677844@sss.pgh.pa.us
Diffstat (limited to 'src/backend/optimizer/path')
-rw-r--r-- | src/backend/optimizer/path/costsize.c | 2 | ||||
-rw-r--r-- | src/backend/optimizer/path/equivclass.c | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 7292d68dbc..1e94c5aa7c 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -6245,7 +6245,7 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel) * scanning this rel, so be sure to include it in reltarget->cost. */ PlaceHolderVar *phv = (PlaceHolderVar *) node; - PlaceHolderInfo *phinfo = find_placeholder_info(root, phv, false); + PlaceHolderInfo *phinfo = find_placeholder_info(root, phv); QualCost cost; tuple_width += phinfo->ph_width; diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 7991295548..2c900e6b12 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -1323,7 +1323,7 @@ generate_base_implied_equalities_no_const(PlannerInfo *root, PVC_RECURSE_WINDOWFUNCS | PVC_INCLUDE_PLACEHOLDERS); - add_vars_to_targetlist(root, vars, ec->ec_relids, false); + add_vars_to_targetlist(root, vars, ec->ec_relids); list_free(vars); } } |