postgres=# \set QUIET 
CREATE TABLE stxdinp (i int, j int) PARTITION BY RANGE(i);
CREATE TABLE stxdinp1 PARTITION OF stxdinp FOR VALUES FROM (1)TO(10);
INSERT INTO stxdinp SELECT generate_series(1,9)a;
CREATE STATISTICS stxdp ON i,j FROM stxdinp;
ANALYZE stxdinp;
explain SELECT i, j, COUNT(1) FROM ONLY stxdinp GROUP BY 1,2;
ERROR:  cache lookup failed for statistics object 4060843

It's evidently an issue with 269b532ae (Add stxdinherit flag to
pg_statistic_ext_data)

(gdb) bt
#0  pg_re_throw () at elog.c:1795
#1  0x000000000096578a in errfinish (filename=<optimized out>, 
filename@entry=0xaf0442 "extended_stats.c", lineno=lineno@entry=2467, 
funcname=funcname@entry=0xaf0720 <__func__.28166> "statext_expressions_load") 
at elog.c:588
#2  0x00000000007efd07 in statext_expressions_load (stxoid=3914359, 
inh=<optimized out>, idx=idx@entry=0) at extended_stats.c:2467
#3  0x0000000000913947 in examine_variable (root=root@entry=0x2b5b530, 
node=node@entry=0x2b88820, varRelid=varRelid@entry=7, 
vardata=vardata@entry=0x7ffe5baa2f00) at selfuncs.c:5264
#4  0x00000000009141ae in get_restriction_variable (root=root@entry=0x2b5b530, 
args=args@entry=0x2b88a30, varRelid=varRelid@entry=7, 
vardata=vardata@entry=0x7ffe5baa2f90, other=other@entry=0x7ffe5baa2f88, 
    varonleft=varonleft@entry=0x7ffe5baa2f87) at selfuncs.c:4848
#5  0x0000000000915535 in eqsel_internal (fcinfo=<optimized out>, 
negate=negate@entry=false) at selfuncs.c:263
#6  0x00000000009155f6 in eqsel (fcinfo=<optimized out>) at selfuncs.c:226
#7  0x000000000096a373 in FunctionCall4Coll 
(flinfo=flinfo@entry=0x7ffe5baa3090, collation=collation@entry=0, 
arg1=arg1@entry=45462832, arg2=arg2@entry=1320, arg3=arg3@entry=45648432, 
arg4=arg4@entry=7) at fmgr.c:1198
#8  0x000000000096a92a in OidFunctionCall4Coll (functionId=<optimized out>, 
collation=collation@entry=0, arg1=arg1@entry=45462832, arg2=arg2@entry=1320, 
arg3=arg3@entry=45648432, arg4=arg4@entry=7) at fmgr.c:1434
#9  0x000000000077e759 in restriction_selectivity (root=root@entry=0x2b5b530, 
operatorid=operatorid@entry=1320, args=0x2b88a30, inputcollid=0, 
varRelid=varRelid@entry=7) at plancat.c:1880
#10 0x0000000000728dc9 in clause_selectivity_ext (root=root@entry=0x2b5b530, 
clause=0x2b889d8, clause@entry=0x2b86e88, varRelid=varRelid@entry=7, 
jointype=jointype@entry=JOIN_INNER, sjinfo=sjinfo@entry=0x0, 
    use_extended_stats=use_extended_stats@entry=true) at clausesel.c:875
#11 0x00000000007291b6 in clauselist_selectivity_ext 
(root=root@entry=0x2b5b530, clauses=0x2b88fc0, varRelid=7, 
jointype=jointype@entry=JOIN_INNER, sjinfo=sjinfo@entry=0x0, 
use_extended_stats=use_extended_stats@entry=true)
    at clausesel.c:185
#12 0x000000000072962e in clauselist_selectivity (root=root@entry=0x2b5b530, 
clauses=<optimized out>, varRelid=<optimized out>, 
jointype=jointype@entry=JOIN_INNER, sjinfo=sjinfo@entry=0x0) at clausesel.c:108
#13 0x000000000072fb1d in get_parameterized_baserel_size 
(root=root@entry=0x2b5b530, rel=rel@entry=0x2b73900, 
param_clauses=param_clauses@entry=0x2b88f68) at costsize.c:5015
#14 0x00000000007836f6 in get_baserel_parampathinfo (root=root@entry=0x2b5b530, 
baserel=baserel@entry=0x2b73900, required_outer=required_outer@entry=0x2b86478) 
at relnode.c:1346
#15 0x0000000000776819 in create_seqscan_path (root=root@entry=0x2b5b530, 
rel=rel@entry=0x2b73900, required_outer=required_outer@entry=0x2b86478, 
parallel_workers=parallel_workers@entry=0) at pathnode.c:937
#16 0x000000000077a32c in reparameterize_path (root=root@entry=0x2b5b530, 
path=path@entry=0x2b847b0, required_outer=required_outer@entry=0x2b86478, 
loop_count=loop_count@entry=1) at pathnode.c:3872
#17 0x00000000007249bc in get_cheapest_parameterized_child_path 
(root=root@entry=0x2b5b530, rel=<optimized out>, 
required_outer=required_outer@entry=0x2b86478) at allpaths.c:1996
#18 0x0000000000727619 in add_paths_to_append_rel (root=root@entry=0x2b5b530, 
rel=rel@entry=0x2b6a6a8, live_childrels=live_childrels@entry=0x2b858e8) at 
allpaths.c:1597
#19 0x0000000000728084 in set_append_rel_pathlist (root=root@entry=0x2b5b530, 
rel=rel@entry=0x2b6a6a8, rti=rti@entry=6, rte=rte@entry=0x2b5e1c0) at 
allpaths.c:1270
#20 0x0000000000727e17 in set_rel_pathlist (root=root@entry=0x2b5b530, 
rel=0x2b6a6a8, rti=rti@entry=6, rte=0x2b5e1c0) at allpaths.c:483
#21 0x0000000000727f8a in set_base_rel_pathlists (root=root@entry=0x2b5b530) at 
allpaths.c:355
#22 0x00000000007286fd in make_one_rel (root=root@entry=0x2b5b530, 
joinlist=joinlist@entry=0x2b6fd98) at allpaths.c:225
#23 0x00000000007512d5 in query_planner (root=root@entry=0x2b5b530, 
qp_callback=qp_callback@entry=0x75300a <standard_qp_callback>, 
qp_extra=qp_extra@entry=0x7ffe5baa3670) at planmain.c:276
#24 0x00000000007589ec in grouping_planner (root=root@entry=0x2b5b530, 
tuple_fraction=<optimized out>, tuple_fraction@entry=0) at planner.c:1467
#25 0x000000000075a5f2 in subquery_planner (glob=<optimized out>, 
parse=parse@entry=0x2b23c08, parent_root=parent_root@entry=0x2736768, 
hasRecursion=hasRecursion@entry=false, tuple_fraction=<optimized out>) at 
planner.c:1044
#26 0x0000000000726567 in set_subquery_pathlist (root=root@entry=0x2736768, 
rel=rel@entry=0x2755f30, rti=rti@entry=6, rte=rte@entry=0x28c9980) at 
allpaths.c:2589
#27 0x000000000072681c in set_rel_size (root=root@entry=0x2736768, 
rel=rel@entry=0x2755f30, rti=rti@entry=6, rte=rte@entry=0x28c9980) at 
allpaths.c:425
#28 0x0000000000726996 in set_base_rel_sizes (root=root@entry=0x2736768) at 
allpaths.c:326
#29 0x0000000000728663 in make_one_rel (root=root@entry=0x2736768, 
joinlist=joinlist@entry=0x274d038) at allpaths.c:188
#30 0x00000000007512d5 in query_planner (root=root@entry=0x2736768, 
qp_callback=qp_callback@entry=0x75300a <standard_qp_callback>, 
qp_extra=qp_extra@entry=0x7ffe5baa39d0) at planmain.c:276
#31 0x00000000007589ec in grouping_planner (root=root@entry=0x2736768, 
tuple_fraction=<optimized out>, tuple_fraction@entry=0) at planner.c:1467
#32 0x000000000075a5f2 in subquery_planner (glob=glob@entry=0x2483430, 
parse=parse@entry=0x289c7c8, parent_root=parent_root@entry=0x0, 
hasRecursion=hasRecursion@entry=false, tuple_fraction=tuple_fraction@entry=0)
    at planner.c:1044

I think this is what's needed.

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 14e0885f19f..4450f0d682f 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -5240,6 +5240,8 @@ examine_variable(PlannerInfo *root, Node *node, int 
varRelid,
                        /* skip stats without per-expression stats */
                        if (info->kind != STATS_EXT_EXPRESSIONS)
                                continue;
+                       if (info->inherit != rte->inh)
+                               continue;
 
                        pos = 0;
                        foreach(expr_item, info->exprs)


Reply via email to