diff options
| author | Tom Lane | 2014-11-28 19:16:24 +0000 |
|---|---|---|
| committer | Tom Lane | 2014-11-28 19:16:24 +0000 |
| commit | d25367ec4f869aac80e97964fa5d7143536818b1 (patch) | |
| tree | dbcc0102cdde5c0147622c3ff317444b0c711b3a /src/backend/optimizer | |
| parent | f4e031c662a6b600b786c4849968a099c58fcce7 (diff) | |
Add bms_get_singleton_member(), and use it where appropriate.
This patch adds a function that replaces a bms_membership() test followed
by a bms_singleton_member() call, performing both the test and the
extraction of a singleton set's member in one scan of the bitmapset.
The performance advantage over the old way is probably minimal in current
usage, but it seems worthwhile on notational grounds anyway.
David Rowley
Diffstat (limited to 'src/backend/optimizer')
| -rw-r--r-- | src/backend/optimizer/path/equivclass.c | 3 | ||||
| -rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 7 | ||||
| -rw-r--r-- | src/backend/optimizer/util/placeholder.c | 4 |
3 files changed, 7 insertions, 7 deletions
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index e5dd58efe33..9919d27374f 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -867,9 +867,8 @@ generate_base_implied_equalities_no_const(PlannerInfo *root, int relid; Assert(!cur_em->em_is_child); /* no children yet */ - if (bms_membership(cur_em->em_relids) != BMS_SINGLETON) + if (!bms_get_singleton_member(cur_em->em_relids, &relid)) continue; - relid = bms_singleton_member(cur_em->em_relids); Assert(relid < root->simple_rel_array_size); if (prev_ems[relid] != NULL) diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 773f8a458e2..e99d416e852 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -162,11 +162,12 @@ join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo) * going to be able to do anything with it. */ if (sjinfo->jointype != JOIN_LEFT || - sjinfo->delay_upper_joins || - bms_membership(sjinfo->min_righthand) != BMS_SINGLETON) + sjinfo->delay_upper_joins) + return false; + + if (!bms_get_singleton_member(sjinfo->min_righthand, &innerrelid)) return false; - innerrelid = bms_singleton_member(sjinfo->min_righthand); innerrel = find_base_rel(root, innerrelid); if (innerrel->reloptkind != RELOPT_BASEREL) diff --git a/src/backend/optimizer/util/placeholder.c b/src/backend/optimizer/util/placeholder.c index 8d7c4feca46..36d19b84e88 100644 --- a/src/backend/optimizer/util/placeholder.c +++ b/src/backend/optimizer/util/placeholder.c @@ -383,10 +383,10 @@ add_placeholders_to_base_rels(PlannerInfo *root) { PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(lc); Relids eval_at = phinfo->ph_eval_at; + int varno; - if (bms_membership(eval_at) == BMS_SINGLETON) + if (bms_get_singleton_member(eval_at, &varno)) { - int varno = bms_singleton_member(eval_at); RelOptInfo *rel = find_base_rel(root, varno); /* add it to reltargetlist if needed above the rel scan level */ |
