diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-11-01 14:34:44 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-11-01 14:34:44 -0400 |
commit | f4857082bc16f36a5cdc6f8328cdc8071bb1715e (patch) | |
tree | b2b7778ccf59ec1f29af8172b78cbf4494a1387e /src/backend/utils/adt/selfuncs.c | |
parent | 495e73c2079eb53fcfbafbe18b7dce81aeb271ec (diff) | |
download | postgresql-f4857082bc16f36a5cdc6f8328cdc8071bb1715e.tar.gz postgresql-f4857082bc16f36a5cdc6f8328cdc8071bb1715e.zip |
Fix planner failure with extended statistics on partitioned tables.
Some cases would result in "cache lookup failed for statistics object",
due to trying to fetch inherited statistics when only non-inherited
ones are available or vice versa.
Richard Guo and Justin Pryzby
Discussion: https://postgr.es/m/20221030170520.GM16921@telsasoft.com
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 69e0fb98f5b..d597b7e81fc 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3913,7 +3913,7 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, Oid statOid = InvalidOid; MVNDistinct *stats; StatisticExtInfo *matched_info = NULL; - RangeTblEntry *rte; + RangeTblEntry *rte = planner_rt_fetch(rel->relid, root); /* bail out immediately if the table has no extended statistics */ if (!rel->statlist) @@ -3933,6 +3933,10 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, if (info->kind != STATS_EXT_NDISTINCT) continue; + /* skip statistics with mismatching stxdinherit value */ + if (info->inherit != rte->inh) + continue; + /* * Determine how many expressions (and variables in non-matched * expressions) match. We'll then use these numbers to pick the @@ -4004,7 +4008,6 @@ estimate_multivariate_ndistinct(PlannerInfo *root, RelOptInfo *rel, Assert(nmatches_vars + nmatches_exprs > 1); - rte = planner_rt_fetch(rel->relid, root); stats = statext_ndistinct_load(statOid, rte->inh); /* @@ -5241,6 +5244,10 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, if (info->kind != STATS_EXT_EXPRESSIONS) continue; + /* skip stats with mismatching stxdinherit value */ + if (info->inherit != rte->inh) + continue; + pos = 0; foreach(expr_item, info->exprs) { |