Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd25367e

Browse files
committed
Add bms_get_singleton_member(), and use it where appropriate.
This patch adds a function that replaces a bms_membership() test followedby a bms_singleton_member() call, performing both the test and theextraction of a singleton set's member in one scan of the bitmapset.The performance advantage over the old way is probably minimal in currentusage, but it seems worthwhile on notational grounds anyway.David Rowley
1 parentf4e031c commitd25367e

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

‎src/backend/nodes/bitmapset.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,50 @@ bms_singleton_member(const Bitmapset *a)
524524
returnresult;
525525
}
526526

527+
/*
528+
* bms_get_singleton_member
529+
*
530+
* Test whether the given set is a singleton.
531+
* If so, set *member to the value of its sole member, and return TRUE.
532+
* If not, return FALSE, without changing *member.
533+
*
534+
* This is more convenient and faster than calling bms_membership() and then
535+
* bms_singleton_member(), if we don't care about distinguishing empty sets
536+
* from multiple-member sets.
537+
*/
538+
bool
539+
bms_get_singleton_member(constBitmapset*a,int*member)
540+
{
541+
intresult=-1;
542+
intnwords;
543+
intwordnum;
544+
545+
if (a==NULL)
546+
return false;
547+
nwords=a->nwords;
548+
for (wordnum=0;wordnum<nwords;wordnum++)
549+
{
550+
bitmapwordw=a->words[wordnum];
551+
552+
if (w!=0)
553+
{
554+
if (result >=0||HAS_MULTIPLE_ONES(w))
555+
return false;
556+
result=wordnum*BITS_PER_BITMAPWORD;
557+
while ((w&255)==0)
558+
{
559+
w >>=8;
560+
result+=8;
561+
}
562+
result+=rightmost_one_pos[w&255];
563+
}
564+
}
565+
if (result<0)
566+
return false;
567+
*member=result;
568+
return true;
569+
}
570+
527571
/*
528572
* bms_num_members - count members of set
529573
*/

‎src/backend/optimizer/path/equivclass.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -867,9 +867,8 @@ generate_base_implied_equalities_no_const(PlannerInfo *root,
867867
intrelid;
868868

869869
Assert(!cur_em->em_is_child);/* no children yet */
870-
if (bms_membership(cur_em->em_relids)!=BMS_SINGLETON)
870+
if (!bms_get_singleton_member(cur_em->em_relids,&relid))
871871
continue;
872-
relid=bms_singleton_member(cur_em->em_relids);
873872
Assert(relid<root->simple_rel_array_size);
874873

875874
if (prev_ems[relid]!=NULL)

‎src/backend/optimizer/plan/analyzejoins.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,12 @@ join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo)
162162
* going to be able to do anything with it.
163163
*/
164164
if (sjinfo->jointype!=JOIN_LEFT||
165-
sjinfo->delay_upper_joins||
166-
bms_membership(sjinfo->min_righthand)!=BMS_SINGLETON)
165+
sjinfo->delay_upper_joins)
166+
return false;
167+
168+
if (!bms_get_singleton_member(sjinfo->min_righthand,&innerrelid))
167169
return false;
168170

169-
innerrelid=bms_singleton_member(sjinfo->min_righthand);
170171
innerrel=find_base_rel(root,innerrelid);
171172

172173
if (innerrel->reloptkind!=RELOPT_BASEREL)

‎src/backend/optimizer/util/placeholder.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,10 @@ add_placeholders_to_base_rels(PlannerInfo *root)
383383
{
384384
PlaceHolderInfo*phinfo= (PlaceHolderInfo*)lfirst(lc);
385385
Relidseval_at=phinfo->ph_eval_at;
386+
intvarno;
386387

387-
if (bms_membership(eval_at)==BMS_SINGLETON)
388+
if (bms_get_singleton_member(eval_at,&varno))
388389
{
389-
intvarno=bms_singleton_member(eval_at);
390390
RelOptInfo*rel=find_base_rel(root,varno);
391391

392392
/* add it to reltargetlist if needed above the rel scan level */

‎src/include/nodes/bitmapset.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ extern bool bms_is_member(int x, const Bitmapset *a);
7272
externboolbms_overlap(constBitmapset*a,constBitmapset*b);
7373
externboolbms_nonempty_difference(constBitmapset*a,constBitmapset*b);
7474
externintbms_singleton_member(constBitmapset*a);
75+
externboolbms_get_singleton_member(constBitmapset*a,int*member);
7576
externintbms_num_members(constBitmapset*a);
7677

7778
/* optimized tests when we don't need to know exact membership count: */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp