diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 595760b19f..6b121fc3a1 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -15,7 +15,9 @@ */ #include "postgres.h" +#include "access/table.h" #include "access/transam.h" +#include "catalog/pg_class.h" #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -24,6 +26,7 @@ #include "optimizer/planmain.h" #include "optimizer/planner.h" #include "optimizer/tlist.h" +#include "partitioning/partdesc.h" #include "tcop/utility.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -3018,6 +3021,9 @@ extract_query_dependencies(Node *query, *relationOids = glob.relationOids; *invalItems = glob.invalItems; *hasRowSecurity = glob.dependsOnRole; + + if (glob.partition_directory != NULL) + DestroyPartitionDirectory(glob.partition_directory); } /* @@ -3060,8 +3066,36 @@ extract_query_dependencies_walker(Node *node, PlannerInfo *context) RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); if (rte->rtekind == RTE_RELATION) - context->glob->relationOids = - lappend_oid(context->glob->relationOids, rte->relid); + { + PlannerGlobal *glob; + + glob = context->glob; + glob->relationOids = + lappend_oid(glob->relationOids, rte->relid); + if (query->commandType == CMD_INSERT && + rte->relkind == RELKIND_PARTITIONED_TABLE) + { + int i; + Relation rel; + PartitionDesc pdesc; + + if (glob->partition_directory == NULL) + glob->partition_directory = + CreatePartitionDirectory(CurrentMemoryContext); + + rel = table_open(rte->relid, NoLock); + pdesc = + PartitionDirectoryLookup(glob->partition_directory, + rel); + + for (i = 0; i < pdesc->nparts; i++) + { + glob->relationOids = + lappend_oid(glob->relationOids, pdesc->oids[i]); + } + table_close(rel, NoLock); + } + } else if (rte->rtekind == RTE_NAMEDTUPLESTORE && OidIsValid(rte->relid)) context->glob->relationOids =