diff options
Diffstat (limited to 'src/backend/nodes/bitmapset.c')
-rw-r--r-- | src/backend/nodes/bitmapset.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c index b0f908f978f..65805d45277 100644 --- a/src/backend/nodes/bitmapset.c +++ b/src/backend/nodes/bitmapset.c @@ -977,6 +977,50 @@ bms_add_members(Bitmapset *a, const Bitmapset *b) } /* + * bms_replace_members + * Remove all existing members from 'a' and repopulate the set with members + * from 'b', recycling 'a', when possible. + */ +Bitmapset * +bms_replace_members(Bitmapset *a, const Bitmapset *b) +{ + int i; + + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + + if (a == NULL) + return bms_copy(b); + if (b == NULL) + { + pfree(a); + return NULL; + } + + if (a->nwords < b->nwords) + a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(b->nwords)); + + i = 0; + do + { + a->words[i] = b->words[i]; + } while (++i < b->nwords); + + a->nwords = b->nwords; + +#ifdef REALLOCATE_BITMAPSETS + + /* + * There's no guarantee that the repalloc returned a new pointer, so copy + * and free unconditionally here. + */ + a = bms_copy_and_free(a); +#endif + + return a; +} + +/* * bms_add_range * Add members in the range of 'lower' to 'upper' to the set. * |