diff options
author | Tomas Vondra <tomas.vondra@postgresql.org> | 2019-11-16 01:17:15 +0100 |
---|---|---|
committer | Tomas Vondra <tomas.vondra@postgresql.org> | 2019-11-16 01:17:15 +0100 |
commit | d482f7f867b58bbd29f65a4471eca8c5b57a7da0 (patch) | |
tree | d6ed8e930c1975ca4407603d0dee6757c4b6951e /src/backend/utils/adt/selfuncs.c | |
parent | 76cbfcdf3a0dff3f029ca079701418b861ce86c8 (diff) | |
download | postgresql-d482f7f867b58bbd29f65a4471eca8c5b57a7da0.tar.gz postgresql-d482f7f867b58bbd29f65a4471eca8c5b57a7da0.zip |
Skip system attributes when applying mvdistinct stats
When estimating number of distinct groups, we failed to ignore system
attributes when matching the group expressions to mvdistinct stats,
causing failures like
ERROR: negative bitmapset member not allowed
Fix that by simply skipping anything that is not a regular attribute.
Backpatch to PostgreSQL 10, where the extended stats were introduced.
Bug: #16111
Reported-by: Tuomas Leikola
Author: Tomas Vondra
Backpatch-through: 10
Discussion: https://postgr.es/m/16111-687799584c3a7e73@postgresql.org
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 35a8995f623..024f325eb02 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3582,14 +3582,19 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, foreach(lc, *varinfos) { GroupVarInfo *varinfo = (GroupVarInfo *) lfirst(lc); + AttrNumber attnum; Assert(varinfo->rel == rel); - if (IsA(varinfo->var, Var)) - { - attnums = bms_add_member(attnums, - ((Var *) varinfo->var)->varattno); - } + if (!IsA(varinfo->var, Var)) + continue; + + attnum = ((Var *) varinfo->var)->varattno; + + if (!AttrNumberIsForUserDefinedAttr(attnum)) + continue; + + attnums = bms_add_member(attnums, attnum); } /* look for the ndistinct statistics matching the most vars */ @@ -3669,6 +3674,10 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, } attnum = ((Var *) varinfo->var)->varattno; + + if (!AttrNumberIsForUserDefinedAttr(attnum)) + continue; + if (!bms_is_member(attnum, matched)) newlist = lappend(newlist, varinfo); } |