From 2a307df1bba7178b3903e01bee5012707f950473 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Fri, 26 Mar 2021 22:34:53 +0100 Subject: [PATCH] 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 17640b2328..2240636e6c 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4025,11 +4025,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;