postgres.git / summary / log / commit / refs
commit e5eb40eed470ef98e50787ccefe6d32674437be4
Author: Tomas Vondra <tomas.vondra@postgresql.org>
Date: Fri Mar 26 21:34:53 2021 +0000
First released in: 14.0, 10.17, 11.12, 12.7, 13.3
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
src/backend/utils/adt/selfuncs.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index e128dccb04b..c2f5f948b06 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -3851,11 +3851,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;
[parent: d544671f1572]