]> granicus.if.org Git - postgresql/commitdiff
Try to exclude partitioned tables in toto.
authorRobert Haas <rhaas@postgresql.org>
Fri, 1 Dec 2017 15:58:08 +0000 (10:58 -0500)
committerRobert Haas <rhaas@postgresql.org>
Fri, 1 Dec 2017 15:59:09 +0000 (10:59 -0500)
Ashutosh Bapat, reviewed by Jeevan Chalke.  Comment by me.

Discussion: http://postgr.es/m/CAFjFpRcuRaydz88CY_aQekmuvmN2A9ax5z0k=ppT+s8KS8xMRA@mail.gmail.com

src/backend/optimizer/util/plancat.c

index 199a2631a11a10c0e8b6dce9f133f7665b09a8a2..f7438714c49322072df6a438edb19705c16964d5 100644 (file)
@@ -1414,8 +1414,18 @@ relation_excluded_by_constraints(PlannerInfo *root,
        if (predicate_refuted_by(safe_restrictions, safe_restrictions, false))
                return true;
 
-       /* Only plain relations have constraints */
-       if (rte->rtekind != RTE_RELATION || rte->inh)
+       /*
+        * Only plain relations have constraints.  In a partitioning hierarchy,
+        * but not with regular table inheritance, it's OK to assume that any
+        * constraints that hold for the parent also hold for every child; for
+        * instance, table inheritance allows the parent to have constraints
+        * marked NO INHERIT, but table partitioning does not.  We choose to check
+        * whether the partitioning parents can be excluded here; doing so
+        * consumes some cycles, but potentially saves us the work of excluding
+        * each child individually.
+        */
+       if (rte->rtekind != RTE_RELATION ||
+               (rte->inh && rte->relkind != RELKIND_PARTITIONED_TABLE))
                return false;
 
        /*