mirror of
https://github.com/postgres/postgres.git
synced 2025-05-05 09:19:17 +03:00
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
This commit is contained in:
parent
a14a0118a1
commit
33e52ad9a3
@ -3987,11 +3987,11 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
|
|
||||||
attnum = ((Var *) varinfo->var)->varattno;
|
attnum = ((Var *) varinfo->var)->varattno;
|
||||||
|
|
||||||
if (!AttrNumberIsForUserDefinedAttr(attnum))
|
if (AttrNumberIsForUserDefinedAttr(attnum) &&
|
||||||
|
bms_is_member(attnum, matched))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!bms_is_member(attnum, matched))
|
newlist = lappend(newlist, varinfo);
|
||||||
newlist = lappend(newlist, varinfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*varinfos = newlist;
|
*varinfos = newlist;
|
||||||
|
@ -260,7 +260,7 @@ SELECT s.stxkind, d.stxdndistinct
|
|||||||
SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b');
|
SELECT * FROM check_estimated_rows('SELECT COUNT(*) FROM ndistinct GROUP BY ctid, a, b');
|
||||||
estimated | actual
|
estimated | actual
|
||||||
-----------+--------
|
-----------+--------
|
||||||
11 | 1000
|
1000 | 1000
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- Hash Aggregate, thanks to estimates improved by the statistic
|
-- Hash Aggregate, thanks to estimates improved by the statistic
|
||||||
|
Loading…
x
Reference in New Issue
Block a user