]> granicus.if.org Git - postgresql/commit
Recognize self-contradictory restriction clauses for non-table relations.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 24 Sep 2011 23:33:16 +0000 (19:33 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 24 Sep 2011 23:33:16 +0000 (19:33 -0400)
commit7741dd6590073719688891898e85f0cb73453159
tree98b57a56460a9b9313609e598efe1b7cf11a6f13
parent337c0b03614c45516f2c3ec956405713bb264d54
Recognize self-contradictory restriction clauses for non-table relations.

The constraint exclusion feature checks for contradictions among scan
restriction clauses, as well as contradictions between those clauses and a
table's CHECK constraints.  The first aspect of this testing can be useful
for non-table relations (such as subqueries or functions-in-FROM), but the
feature was coded with only the CHECK case in mind so we were applying it
only to plain-table RTEs.  Move the relation_excluded_by_constraints call
so that it is applied to all RTEs not just plain tables.  With the default
setting of constraint_exclusion this results in no extra work, but with
constraint_exclusion = ON we will detect optimizations that we missed
before (at the cost of more planner cycles than we expended before).

Per a gripe from Gunnlaugur Þór Briem.  Experimentation with
his example also showed we were not being very bright about the case where
constraint exclusion is proven within a subquery within UNION ALL, so tweak
the code to allow set_append_rel_pathlist to recognize such cases.
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/plan/planner.c
src/include/optimizer/planner.h