diff options
Diffstat (limited to 'src/backend/statistics/dependencies.c')
-rw-r--r-- | src/backend/statistics/dependencies.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c index 9493b2d5397..ce31c959a9e 100644 --- a/src/backend/statistics/dependencies.c +++ b/src/backend/statistics/dependencies.c @@ -951,14 +951,14 @@ dependencies_clauselist_selectivity(PlannerInfo *root, Bitmapset *clauses_attnums = NULL; StatisticExtInfo *stat; MVDependencies *dependencies; - AttrNumber *list_attnums; + Bitmapset **list_attnums; int listidx; /* check if there's any stats that might be useful for us. */ if (!has_stats_of_kind(rel->statlist, STATS_EXT_DEPENDENCIES)) return 1.0; - list_attnums = (AttrNumber *) palloc(sizeof(AttrNumber) * + list_attnums = (Bitmapset **) palloc(sizeof(Bitmapset *) * list_length(clauses)); /* @@ -981,11 +981,11 @@ dependencies_clauselist_selectivity(PlannerInfo *root, if (!bms_is_member(listidx, *estimatedclauses) && dependency_is_compatible_clause(clause, rel->relid, &attnum)) { - list_attnums[listidx] = attnum; + list_attnums[listidx] = bms_make_singleton(attnum); clauses_attnums = bms_add_member(clauses_attnums, attnum); } else - list_attnums[listidx] = InvalidAttrNumber; + list_attnums[listidx] = NULL; listidx++; } @@ -1002,8 +1002,8 @@ dependencies_clauselist_selectivity(PlannerInfo *root, } /* find the best suited statistics object for these attnums */ - stat = choose_best_statistics(rel->statlist, clauses_attnums, - STATS_EXT_DEPENDENCIES); + stat = choose_best_statistics(rel->statlist, STATS_EXT_DEPENDENCIES, + list_attnums, list_length(clauses)); /* if no matching stats could be found then we've nothing to do */ if (!stat) @@ -1043,16 +1043,22 @@ dependencies_clauselist_selectivity(PlannerInfo *root, foreach(l, clauses) { Node *clause; + AttrNumber attnum; listidx++; /* * Skip incompatible clauses, and ones we've already estimated on. */ - if (list_attnums[listidx] == InvalidAttrNumber) + if (!list_attnums[listidx]) continue; /* + * We expect the bitmaps ton contain a single attribute number. + */ + attnum = bms_singleton_member(list_attnums[listidx]); + + /* * Technically we could find more than one clause for a given * attnum. Since these clauses must be equality clauses, we choose * to only take the selectivity estimate from the final clause in @@ -1061,8 +1067,7 @@ dependencies_clauselist_selectivity(PlannerInfo *root, * anyway. If it happens to be compared to the same Const, then * ignoring the additional clause is just the thing to do. */ - if (dependency_implies_attribute(dependency, - list_attnums[listidx])) + if (dependency_implies_attribute(dependency, attnum)) { clause = (Node *) lfirst(l); @@ -1077,8 +1082,7 @@ dependencies_clauselist_selectivity(PlannerInfo *root, * We'll want to ignore this when looking for the next * strongest dependency above. */ - clauses_attnums = bms_del_member(clauses_attnums, - list_attnums[listidx]); + clauses_attnums = bms_del_member(clauses_attnums, attnum); } } |