Starting to look at the planner code, I found an oversight in the way expression stats are read at the start of planning -- it is necessary to call ChangeVarNodes() on any expressions if the relid isn't 1, otherwise the stats expressions may contain Var nodes referring to the wrong relation. Possibly the easiest place to do that would be in get_relation_statistics(), if rel->relid != 1.
Here's a simple test case: CREATE TABLE foo AS SELECT x FROM generate_series(1,100000) g(x); CREATE STATISTICS foo_s ON (x%10) FROM foo; ANALYSE foo; EXPLAIN SELECT * FROM foo WHERE x%10 = 0; EXPLAIN SELECT * FROM (SELECT 1) t, foo WHERE x%10 = 0; (in the second query, the stats don't get applied). Regards, Dean