Hi All, Consider a parent table which has no child in the current session, but has temporary children in other sessions.
Session 1 postgres=# create table parent (a int); CREATE TABLE Session 2: postgres=# create temp table temp_child () inherits(parent); CREATE TABLE Before commit d3cc37f1d801a6b5cad9bf179274a8d767f1ee50. We would have Seq Scan plan for scanning parent in session 1 postgres=# explain verbose select * from parent; QUERY PLAN ------------------------------------------------------------- Seq Scan on public.parent (cost=0.00..0.00 rows=1 width=4) Output: parent.a (2 rows) In session 2, it would be an Append plan postgres=# explain verbose select * from parent; QUERY PLAN ------------------------------------------------------------------------------ Append (cost=0.00..35.50 rows=2551 width=4) -> Seq Scan on public.parent (cost=0.00..0.00 rows=1 width=4) Output: parent.a -> Seq Scan on pg_temp_4.temp_child (cost=0.00..35.50 rows=2550 width=4) Output: temp_child.a (5 rows) After that commit in session 1, we get an Append plan postgres=# explain verbose select * from parent; QUERY PLAN ------------------------------------------------------------------- Append (cost=0.00..0.00 rows=1 width=4) -> Seq Scan on public.parent (cost=0.00..0.00 rows=1 width=4) Output: parent.a (3 rows) I don't think this is an intentional change. Here's patch to fix it. The comment in the patch uses term "real child" in the context of comments about temporary children from other session and the comment at the end of the function where rte->inh is reset. May be we should move the second comment before setting has_child in the patch and use "real child" in the comment at the end to avoid repetition. But I want to first check whether we want this fix or we can live with the Append plan. -- 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..b640639 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -1374,7 +1374,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 +1448,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 +1502,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 +1585,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