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:34:58 +0100 |
commit | 33e52ad9a32929a6d14dfd98a8440d57028f2e3e (patch) | |
tree | fbf8df234e380eee684ed792a7e8ef9b1082bec4 /src/backend/utils/adt/selfuncs.c | |
parent | a14a0118a1fecf4066e53af52ed0f188607d0c4b (diff) | |
download | postgresql-33e52ad9a32929a6d14dfd98a8440d57028f2e3e.tar.gz postgresql-33e52ad9a32929a6d14dfd98a8440d57028f2e3e.zip |
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
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 52314d3aa1c..2348d4a772a 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3987,11 +3987,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; |