aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Vondra <tomas.vondra@postgresql.org>2021-03-26 22:34:53 +0100
committerTomas Vondra <tomas.vondra@postgresql.org>2021-03-26 22:40:00 +0100
commit88acb0135720076599308e6fd58b659c81d1beba (patch)
tree94c91447b2a11273ed6acd36b38abb9bff5a2cd3 /src
parent366aa374b315667fe44480ec8934cb1034ba0930 (diff)
downloadpostgresql-88acb0135720076599308e6fd58b659c81d1beba.tar.gz
postgresql-88acb0135720076599308e6fd58b659c81d1beba.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')
-rw-r--r--src/backend/utils/adt/selfuncs.c6
-rw-r--r--src/test/regress/expected/stats_ext.out2
2 files changed, 4 insertions, 4 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 2fefa916216..69a8b41f2a0 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -3743,11 +3743,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 f2a1863c7b1..f7b351ec8e2 100644
--- a/src/test/regress/expected/stats_ext.out
+++ b/src/test/regress/expected/stats_ext.out
@@ -222,7 +222,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