mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
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
This commit is contained in:
@ -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,
|
|||||||
* 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,
|
|||||||
{
|
{
|
||||||
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]
|
||||||
|
Reference in New Issue
Block a user