On Fri, Aug 11, 2017 at 9:08 PM, Robert Haas <robertmh...@gmail.com> wrote: > > rhaas=# create table parent (a int) partition by list (a); > CREATE TABLE > rhaas=# create temp table child partition of parent for values in (1); > CREATE TABLE > rhaas=# explain verbose select * from parent; > QUERY PLAN > ------------------------------------------------------------------------- > Append (cost=0.00..35.50 rows=2550 width=4) > -> Seq Scan on pg_temp_3.child (cost=0.00..35.50 rows=2550 width=4) > Output: child.a > (3 rows) > > But the comments say: > > * A childless table is never considered to be an inheritance set; therefore > * a parent RTE must always have at least two associated AppendRelInfos. > > Yet, not. So at least the comments need to be updated;
A partitioned table with at least a single partition is not childless. So, above comment doesn't apply here. In a regular inheritance there will be at least two AppendRelInfos one representing a scan on the parent table and others representing the scan on children. The comment needs to be distinguish between regular inheritance and partitioned inheritance. I have modified the comments that way. > not sure if we > want to try to eliminate the Append node in this case also. > The rest of the query tree and plan tree, expects parent's targetlist which may be different from that of the child. A notable difference is whole row expressions getting translated using ConvertRowExpr, which are not expected to pop up in a scan's targetlist. So we can't eliminate the Append node. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index cf46b74..23c66f2 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -1360,8 +1360,12 @@ expand_inherited_tables(PlannerInfo *root) * table, but with inh = false, to represent the parent table in its role * as a simple member of the inheritance set. * - * A childless table is never considered to be an inheritance set; therefore - * a parent RTE must always have at least two associated AppendRelInfos. + * A childless table is never considered to be an inheritance set. In case of + * regular inheritance a parent RTE must always have at least two associated + * AppendRelInfos: one corresponding to the parent table as a simple member of + * inheritance set and one or more corresponding the actual children. We do not + * scan a partitioned table, and hence do not create AppendRelInfo for it. + * Hence a partitioned table must have at least one asscociated AppendRelInfo. */ static void expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) @@ -1374,7 +1378,7 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) List *inhOIDs; List *appinfos; ListCell *l; - bool need_append; + bool has_child; PartitionedChildRelInfo *pcinfo; List *partitioned_child_rels = NIL; @@ -1448,7 +1452,7 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) /* Scan the inheritance set and expand it */ appinfos = NIL; - need_append = false; + has_child = false; foreach(l, inhOIDs) { Oid childOID = lfirst_oid(l); @@ -1502,7 +1506,10 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) */ if (childrte->relkind != RELKIND_PARTITIONED_TABLE) { - need_append = true; + /* Remember if we saw a real child. */ + if (childOID != parentOID) + has_child = true; + appinfo = makeNode(AppendRelInfo); appinfo->parent_relid = rti; appinfo->child_relid = childRTindex; @@ -1582,7 +1589,7 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) * the parent table is harmless, so we don't bother to get rid of it; * ditto for the useless PlanRowMark node. */ - if (!need_append) + if (!has_child) { /* Clear flag before returning */ rte->inh = false;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers