Commit c34605da authored by David Rowley's avatar David Rowley

Fixup some misusages of bms_num_members()

It's a bit inefficient to test if a Bitmapset is empty by counting all the
members and seeing if that number is zero. It's much better just to use
bms_is_empty().  Likewise for checking if there are at least two members,
just use bms_membership(), which does not need to do anything more after
finding two members.

Discussion: https://postgr.es/m/CAApHDvpvwm_QjbDOb5xga%2BKmX9XkN9xQavNGm3SvDbVnCYOerQ%40mail.gmail.com
Reviewed-by: Tomas Vondra
parent ff60394a
...@@ -164,8 +164,7 @@ clauselist_selectivity_simple(PlannerInfo *root, ...@@ -164,8 +164,7 @@ clauselist_selectivity_simple(PlannerInfo *root,
* directly to clause_selectivity(). None of what we might do below is * directly to clause_selectivity(). None of what we might do below is
* relevant. * relevant.
*/ */
if ((list_length(clauses) == 1) && if (list_length(clauses) == 1 && bms_is_empty(estimatedclauses))
bms_num_members(estimatedclauses) == 0)
return clause_selectivity(root, (Node *) linitial(clauses), return clause_selectivity(root, (Node *) linitial(clauses),
varRelid, jointype, sjinfo); varRelid, jointype, sjinfo);
......
...@@ -1246,7 +1246,7 @@ dependencies_clauselist_selectivity(PlannerInfo *root, ...@@ -1246,7 +1246,7 @@ dependencies_clauselist_selectivity(PlannerInfo *root,
* of clauses. We must return 1.0 so the calling function's selectivity is * of clauses. We must return 1.0 so the calling function's selectivity is
* unaffected. * unaffected.
*/ */
if (bms_num_members(clauses_attnums) < 2) if (bms_membership(clauses_attnums) != BMS_MULTIPLE)
{ {
bms_free(clauses_attnums); bms_free(clauses_attnums);
pfree(list_attnums); pfree(list_attnums);
...@@ -1273,18 +1273,18 @@ dependencies_clauselist_selectivity(PlannerInfo *root, ...@@ -1273,18 +1273,18 @@ dependencies_clauselist_selectivity(PlannerInfo *root,
{ {
StatisticExtInfo *stat = (StatisticExtInfo *) lfirst(l); StatisticExtInfo *stat = (StatisticExtInfo *) lfirst(l);
Bitmapset *matched; Bitmapset *matched;
int num_matched; BMS_Membership membership;
/* skip statistics that are not of the correct type */ /* skip statistics that are not of the correct type */
if (stat->kind != STATS_EXT_DEPENDENCIES) if (stat->kind != STATS_EXT_DEPENDENCIES)
continue; continue;
matched = bms_intersect(clauses_attnums, stat->keys); matched = bms_intersect(clauses_attnums, stat->keys);
num_matched = bms_num_members(matched); membership = bms_membership(matched);
bms_free(matched); bms_free(matched);
/* skip objects matching fewer than two attributes from clauses */ /* skip objects matching fewer than two attributes from clauses */
if (num_matched < 2) if (membership != BMS_MULTIPLE)
continue; continue;
func_dependencies[nfunc_dependencies] func_dependencies[nfunc_dependencies]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment