diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-11-28 13:37:25 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-11-28 13:37:25 -0500 |
commit | f4e031c662a6b600b786c4849968a099c58fcce7 (patch) | |
tree | 6a082f889ff2ea5b64bb43c467760686e5f013b0 /src/backend/optimizer/util/var.c | |
parent | 96d66bcfc60d9bcb7db767f23d33abf4d8bc7021 (diff) |
Add bms_next_member(), and use it where appropriate.
This patch adds a way of iterating through the members of a bitmapset
nondestructively, unlike the old way with bms_first_member(). While
bms_next_member() is very slightly slower than bms_first_member()
(at least for typical-size bitmapsets), eliminating the need to palloc
and pfree a temporary copy of the target bitmapset is a significant win.
So this method should be preferred in all cases where a temporary copy
would be necessary.
Tom Lane, with suggestions from Dean Rasheed and David Rowley
Diffstat (limited to 'src/backend/optimizer/util/var.c')
-rw-r--r-- | src/backend/optimizer/util/var.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index d4f46b8d461..a64a8d7d5ff 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -773,11 +773,10 @@ static Relids alias_relid_set(PlannerInfo *root, Relids relids) { Relids result = NULL; - Relids tmprelids; int rtindex; - tmprelids = bms_copy(relids); - while ((rtindex = bms_first_member(tmprelids)) >= 0) + rtindex = -1; + while ((rtindex = bms_next_member(relids, rtindex)) >= 0) { RangeTblEntry *rte = rt_fetch(rtindex, root->parse->rtable); @@ -786,6 +785,5 @@ alias_relid_set(PlannerInfo *root, Relids relids) else result = bms_add_member(result, rtindex); } - bms_free(tmprelids); return result; } |