diff options
author | Tomas Vondra <tomas.vondra@postgresql.org> | 2021-03-26 22:34:53 +0100 |
---|---|---|
committer | Tomas Vondra <tomas.vondra@postgresql.org> | 2021-03-26 22:37:45 +0100 |
commit | 67251c82af87865989eb90c7e8f4546cc0d66e6d (patch) | |
tree | 366763a8cae2979a6be0b48d83caa0ab6e16bf82 | |
parent | c8622999b7fe53741304f2aca73560aade6557d2 (diff) |
Fix ndistinct estimates with system attributes
When estimating the number of groups using extended statistics, the code
was discarding information about system attributes. This led to strange
situation that
SELECT 1 FROM t GROUP BY ctid;
could have produced higher estimate (equal to pg_class.reltuples) than
SELECT 1 FROM t GROUP BY a, b, ctid;
with extended statistics on (a,b). Fixed by retaining information about
the system attribute.
Backpatch all the way to 10, where extended statistics were introduced.
Author: Tomas Vondra
Backpatch-through: 10
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 6 | ||||
-rw-r--r-- | src/test/regress/expected/stats_ext.out | 2 |
2 files changed, 4 insertions, 4 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 868087a8f43..e96bfce4dc3 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3989,11 +3989,11 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, attnum = ((Var *) varinfo->var)->varattno; - if (!AttrNumberIsForUserDefinedAttr(attnum)) + if (AttrNumberIsForUserDefinedAttr(attnum) && + bms_is_member(attnum, matched)) continue; - if (!bms_is_member(attnum, matched)) - newlist = lappend(newlist, varinfo); + newlist = lappend(newlist, varinfo); } *varinfos = newlist; diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index 46005b9203f..7524e651422 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -260,7 +260,7 @@ SELECT s.stxkind, d.stxdndistinct SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b'); estimated | actual -----------+-------- - 11 | 1000 + 1000 | 1000 (1 row) -- Hash Aggregate, thanks to estimates improved by the statistic |