Adapt executor. partdesc
authorRobert Haas <[email protected]>
Wed, 19 Dec 2018 19:58:01 +0000 (14:58 -0500)
committerRobert Haas <[email protected]>
Wed, 19 Dec 2018 19:58:01 +0000 (14:58 -0500)
src/backend/executor/execPartition.c
src/include/nodes/execnodes.h

index ed3616e6611938a19cb214bf88c2093ca7119454..ca6698dec149df538e7eef2594e616616178f8b2 100644 (file)
@@ -23,6 +23,7 @@
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "partitioning/partbounds.h"
+#include "partitioning/partdir.h"
 #include "partitioning/partprune.h"
 #include "rewrite/rewriteManip.h"
 #include "utils/lsyscache.h"
@@ -165,8 +166,10 @@ static void ExecInitRoutingInfo(ModifyTableState *mtstate,
                                        PartitionDispatch dispatch,
                                        ResultRelInfo *partRelInfo,
                                        int partidx);
-static PartitionDispatch ExecInitPartitionDispatchInfo(PartitionTupleRouting *proute,
-                                                         Oid partoid, PartitionDispatch parent_pd, int partidx);
+static PartitionDispatch ExecInitPartitionDispatchInfo(EState *estate,
+                                                         PartitionTupleRouting *proute,
+                                                         Oid partoid, PartitionDispatch parent_pd,
+                                                         int partidx);
 static void FormPartitionKeyDatum(PartitionDispatch pd,
                                          TupleTableSlot *slot,
                                          EState *estate,
@@ -227,7 +230,8 @@ ExecSetupPartitionTupleRouting(EState *estate, ModifyTableState *mtstate, Relati
         * parent as NULL as we don't need to care about any parent of the target
         * partitioned table.
         */
-       ExecInitPartitionDispatchInfo(proute, RelationGetRelid(rel), NULL, 0);
+       ExecInitPartitionDispatchInfo(estate, proute, RelationGetRelid(rel),
+                                                                 NULL, 0);
 
        /*
         * If performing an UPDATE with tuple routing, we can reuse partition
@@ -428,7 +432,7 @@ ExecFindPartition(ModifyTableState *mtstate,
                                 * Create the new PartitionDispatch.  We pass the current one
                                 * in as the parent PartitionDispatch
                                 */
-                               subdispatch = ExecInitPartitionDispatchInfo(proute,
+                               subdispatch = ExecInitPartitionDispatchInfo(estate, proute,
                                                                                                                        partdesc->oids[partidx],
                                                                                                                        dispatch, partidx);
                                Assert(dispatch->indexes[partidx] >= 0 &&
@@ -970,8 +974,9 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
  *             newly created PartitionDispatch later.
  */
 static PartitionDispatch
-ExecInitPartitionDispatchInfo(PartitionTupleRouting *proute, Oid partoid,
-                                                         PartitionDispatch parent_pd, int partidx)
+ExecInitPartitionDispatchInfo(EState *estate, PartitionTupleRouting *proute,
+                                                         Oid partoid, PartitionDispatch parent_pd,
+                                                         int partidx)
 {
        Relation        rel;
        PartitionDesc partdesc;
@@ -985,7 +990,12 @@ ExecInitPartitionDispatchInfo(PartitionTupleRouting *proute, Oid partoid,
                rel = heap_open(partoid, NoLock);
        else
                rel = proute->partition_root;
-       partdesc = RelationGetPartitionDesc(rel);
+
+       if (estate->es_partition_directory == NULL)
+               estate->es_partition_directory =
+                       CreatePartitionDirectory(estate->es_query_cxt);
+       partdesc = PartitionDirectoryLookup(estate->es_partition_directory,
+                                                                               rel);
 
        pd = (PartitionDispatch) palloc(offsetof(PartitionDispatchData, indexes) +
                                                                        partdesc->nparts * sizeof(int));
index 5ed0f40f6970fbfa58ad27669064a204214fd776..985c752d010a44d8219b99cd2bb73ab8612ed7d0 100644 (file)
@@ -21,6 +21,7 @@
 #include "lib/pairingheap.h"
 #include "nodes/params.h"
 #include "nodes/plannodes.h"
+#include "partitioning/partdefs.h"
 #include "utils/hsearch.h"
 #include "utils/queryenvironment.h"
 #include "utils/reltrigger.h"
@@ -523,6 +524,9 @@ typedef struct EState
         */
        List       *es_tuple_routing_result_relations;
 
+       /* Directory of partitions used for any purpose. */
+       PartitionDirectory      es_partition_directory;
+
        /* Stuff used for firing triggers: */
        List       *es_trig_target_relations;   /* trigger-only ResultRelInfos */
        TupleTableSlot *es_trig_tuple_slot; /* for trigger output tuples */