Remove PartitionRoutingInfo struct.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 19 Oct 2020 11:11:57 +0000 (14:11 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 19 Oct 2020 11:42:55 +0000 (14:42 +0300)
The extra indirection neeeded to access its members via its enclosing
ResultRelInfo seems pointless. Move all the fields from
PartitionRoutingInfo to ResultRelInfo.

Author: Amit Langote
Reviewed-by: Alvaro Herrera
Discussion: https://www.postgresql.org/message-id/CA%2BHiwqFViT47Zbr_ASBejiK7iDG8%3DQ1swQ-tjM6caRPQ67pT%3Dw%40mail.gmail.com

src/backend/commands/copy.c
src/backend/executor/execMain.c
src/backend/executor/execPartition.c
src/backend/executor/nodeModifyTable.c
src/backend/replication/logical/worker.c
src/include/executor/execPartition.h
src/include/nodes/execnodes.h

index b4ccd35ec1809f94c1b056ae196d0f4ea5debc2b..36ddcdccdb837564e0e7fc2ee108588c6c3cef29 100644 (file)
@@ -3119,7 +3119,7 @@ CopyFrom(CopyState cstate)
             * We might need to convert from the root rowtype to the partition
             * rowtype.
             */
-           map = resultRelInfo->ri_PartitionInfo->pi_RootToPartitionMap;
+           map = resultRelInfo->ri_RootToPartitionMap;
            if (insertMethod == CIM_SINGLE || !leafpart_use_multi_insert)
            {
                /* non batch insert */
@@ -3127,7 +3127,7 @@ CopyFrom(CopyState cstate)
                {
                    TupleTableSlot *new_slot;
 
-                   new_slot = resultRelInfo->ri_PartitionInfo->pi_PartitionTupleSlot;
+                   new_slot = resultRelInfo->ri_PartitionTupleSlot;
                    myslot = execute_attr_map_slot(map->attrMap, myslot, new_slot);
                }
            }
index fcdd4b356741f8122fd86b79c46087c0c41c1d9b..aea04794487f486ccf82ecf222fee08cf774796b 100644 (file)
@@ -1243,7 +1243,9 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo,
    resultRelInfo->ri_TrigOldSlot = NULL;
    resultRelInfo->ri_TrigNewSlot = NULL;
    resultRelInfo->ri_PartitionRoot = partition_root;
-   resultRelInfo->ri_PartitionInfo = NULL; /* may be set later */
+   resultRelInfo->ri_RootToPartitionMap = NULL;    /* set by
+                                                    * ExecInitRoutingInfo */
+   resultRelInfo->ri_PartitionTupleSlot = NULL;    /* ditto */
    resultRelInfo->ri_ChildToRootMap = NULL;
    resultRelInfo->ri_CopyMultiInsertBuffer = NULL;
 }
index 08f91e59a7acd95cd4b2d4e2808b62b65d5c08c9..86594bd0565b694aa9185b608317fd8faf6a2588 100644 (file)
@@ -261,7 +261,7 @@ ExecSetupPartitionTupleRouting(EState *estate, ModifyTableState *mtstate,
  * If the partition's ResultRelInfo does not yet exist in 'proute' then we set
  * one up or reuse one from mtstate's resultRelInfo array.  When reusing a
  * ResultRelInfo from the mtstate we verify that the relation is a valid
- * target for INSERTs and then set up a PartitionRoutingInfo for it.
+ * target for INSERTs and initialize tuple routing information.
  *
  * rootResultRelInfo is the relation named in the query.
  *
@@ -307,6 +307,7 @@ ExecFindPartition(ModifyTableState *mtstate,
    while (dispatch != NULL)
    {
        int         partidx = -1;
+       bool        is_leaf;
 
        CHECK_FOR_INTERRUPTS();
 
@@ -346,8 +347,10 @@ ExecFindPartition(ModifyTableState *mtstate,
                     errtable(rel)));
        }
 
-       if (partdesc->is_leaf[partidx])
+       is_leaf = partdesc->is_leaf[partidx];
+       if (is_leaf)
        {
+
            /*
             * We've reached the leaf -- hurray, we're done.  Look to see if
             * we've already got a ResultRelInfo for this partition.
@@ -382,7 +385,10 @@ ExecFindPartition(ModifyTableState *mtstate,
                        /* Verify this ResultRelInfo allows INSERTs */
                        CheckValidResultRel(rri, CMD_INSERT);
 
-                       /* Set up the PartitionRoutingInfo for it */
+                       /*
+                        * Initialize information needed to insert this and
+                        * subsequent tuples routed to this partition.
+                        */
                        ExecInitRoutingInfo(mtstate, estate, proute, dispatch,
                                            rri, partidx);
                    }
@@ -464,8 +470,6 @@ ExecFindPartition(ModifyTableState *mtstate,
         */
        if (partidx == partdesc->boundinfo->default_index)
        {
-           PartitionRoutingInfo *partrouteinfo = rri->ri_PartitionInfo;
-
            /*
             * The tuple must match the partition's layout for the constraint
             * expression to be evaluated successfully.  If the partition is
@@ -478,13 +482,13 @@ ExecFindPartition(ModifyTableState *mtstate,
             * So if we have to convert, do it from the root slot; if not, use
             * the root slot as-is.
             */
-           if (partrouteinfo)
+           if (is_leaf)
            {
-               TupleConversionMap *map = partrouteinfo->pi_RootToPartitionMap;
+               TupleConversionMap *map = rri->ri_RootToPartitionMap;
 
                if (map)
                    slot = execute_attr_map_slot(map->attrMap, rootslot,
-                                                partrouteinfo->pi_PartitionTupleSlot);
+                                                rri->ri_PartitionTupleSlot);
                else
                    slot = rootslot;
            }
@@ -788,7 +792,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate,
        {
            TupleConversionMap *map;
 
-           map = leaf_part_rri->ri_PartitionInfo->pi_RootToPartitionMap;
+           map = leaf_part_rri->ri_RootToPartitionMap;
 
            Assert(node->onConflictSet != NIL);
            Assert(rootResultRelInfo->ri_onConflict != NULL);
@@ -949,18 +953,15 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
                    int partidx)
 {
    MemoryContext oldcxt;
-   PartitionRoutingInfo *partrouteinfo;
    int         rri_index;
 
    oldcxt = MemoryContextSwitchTo(proute->memcxt);
 
-   partrouteinfo = palloc(sizeof(PartitionRoutingInfo));
-
    /*
     * Set up a tuple conversion map to convert a tuple routed to the
     * partition from the parent's type to the partition's.
     */
-   partrouteinfo->pi_RootToPartitionMap =
+   partRelInfo->ri_RootToPartitionMap =
        convert_tuples_by_name(RelationGetDescr(partRelInfo->ri_PartitionRoot),
                               RelationGetDescr(partRelInfo->ri_RelationDesc));
 
@@ -970,7 +971,7 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
     * for various operations that are applied to tuples after routing, such
     * as checking constraints.
     */
-   if (partrouteinfo->pi_RootToPartitionMap != NULL)
+   if (partRelInfo->ri_RootToPartitionMap != NULL)
    {
        Relation    partrel = partRelInfo->ri_RelationDesc;
 
@@ -979,11 +980,11 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
         * partition's TupleDesc; TupleDesc reference will be released at the
         * end of the command.
         */
-       partrouteinfo->pi_PartitionTupleSlot =
+       partRelInfo->ri_PartitionTupleSlot =
            table_slot_create(partrel, &estate->es_tupleTable);
    }
    else
-       partrouteinfo->pi_PartitionTupleSlot = NULL;
+       partRelInfo->ri_PartitionTupleSlot = NULL;
 
    /*
     * If the partition is a foreign table, let the FDW init itself for
@@ -993,7 +994,6 @@ ExecInitRoutingInfo(ModifyTableState *mtstate,
        partRelInfo->ri_FdwRoutine->BeginForeignInsert != NULL)
        partRelInfo->ri_FdwRoutine->BeginForeignInsert(mtstate, partRelInfo);
 
-   partRelInfo->ri_PartitionInfo = partrouteinfo;
    partRelInfo->ri_CopyMultiInsertBuffer = NULL;
 
    /*
index 5f85fd7cd88fd9a3b49382326928fd6646650cae..a33423c896e3703c982bc8ee0b90351054fee1b4 100644 (file)
@@ -1172,8 +1172,8 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate,
                                 planSlot, estate, canSetTag);
 
    /*
-    * Reset the transition state that may possibly have been written
-    * by INSERT.
+    * Reset the transition state that may possibly have been written by
+    * INSERT.
     */
    if (mtstate->mt_transition_capture)
        mtstate->mt_transition_capture->tcs_original_insert_tuple = NULL;
@@ -1874,7 +1874,6 @@ ExecPrepareTupleRouting(ModifyTableState *mtstate,
                        ResultRelInfo **partRelInfo)
 {
    ResultRelInfo *partrel;
-   PartitionRoutingInfo *partrouteinfo;
    TupleConversionMap *map;
 
    /*
@@ -1885,8 +1884,6 @@ ExecPrepareTupleRouting(ModifyTableState *mtstate,
     * UPDATE to another partition becomes a DELETE+INSERT.
     */
    partrel = ExecFindPartition(mtstate, targetRelInfo, proute, slot, estate);
-   partrouteinfo = partrel->ri_PartitionInfo;
-   Assert(partrouteinfo != NULL);
 
    /*
     * If we're capturing transition tuples, we might need to convert from the
@@ -1909,10 +1906,10 @@ ExecPrepareTupleRouting(ModifyTableState *mtstate,
    /*
     * Convert the tuple, if necessary.
     */
-   map = partrouteinfo->pi_RootToPartitionMap;
+   map = partrel->ri_RootToPartitionMap;
    if (map != NULL)
    {
-       TupleTableSlot *new_slot = partrouteinfo->pi_PartitionTupleSlot;
+       TupleTableSlot *new_slot = partrel->ri_PartitionTupleSlot;
 
        slot = execute_attr_map_slot(map->attrMap, slot, new_slot);
    }
@@ -2327,8 +2324,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
         * to the format of the table mentioned in the query (root relation).
         * It's needed for update tuple routing, because the routing starts
         * from the root relation.  It's also needed for capturing transition
-        * tuples, because the transition tuple store can only store tuples
-        * in the root table format.
+        * tuples, because the transition tuple store can only store tuples in
+        * the root table format.
         *
         * For INSERT, the map is only initialized for a given partition when
         * the partition itself is first initialized by ExecFindPartition().
@@ -2363,9 +2360,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
            ExecSetupPartitionTupleRouting(estate, mtstate, rel);
 
    /*
-    * For update row movement we'll need a dedicated slot to store the
-    * tuples that have been converted from partition format to the root
-    * table format.
+    * For update row movement we'll need a dedicated slot to store the tuples
+    * that have been converted from partition format to the root table
+    * format.
     */
    if (update_tuple_routing_needed)
        mtstate->mt_root_tuple_slot = table_slot_create(rel, NULL);
index b8e297c5d34e8bcd9ca4fa5121428c0e59448a3d..3a5b733ee38c2d20c4b365546a114c2039c056b2 100644 (file)
@@ -1572,7 +1572,6 @@ apply_handle_tuple_routing(ResultRelInfo *relinfo,
    ResultRelInfo *partrelinfo;
    Relation    partrel;
    TupleTableSlot *remoteslot_part;
-   PartitionRoutingInfo *partinfo;
    TupleConversionMap *map;
    MemoryContext oldctx;
 
@@ -1599,11 +1598,10 @@ apply_handle_tuple_routing(ResultRelInfo *relinfo,
     * partition's rowtype. Convert if needed or just copy, using a dedicated
     * slot to store the tuple in any case.
     */
-   partinfo = partrelinfo->ri_PartitionInfo;
-   remoteslot_part = partinfo->pi_PartitionTupleSlot;
+   remoteslot_part = partrelinfo->ri_PartitionTupleSlot;
    if (remoteslot_part == NULL)
        remoteslot_part = table_slot_create(partrel, &estate->es_tupleTable);
-   map = partinfo->pi_RootToPartitionMap;
+   map = partrelinfo->ri_RootToPartitionMap;
    if (map != NULL)
        remoteslot_part = execute_attr_map_slot(map->attrMap, remoteslot,
                                                remoteslot_part);
@@ -1748,12 +1746,11 @@ apply_handle_tuple_routing(ResultRelInfo *relinfo,
                     */
                    oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
                    partrel = partrelinfo_new->ri_RelationDesc;
-                   partinfo = partrelinfo_new->ri_PartitionInfo;
-                   remoteslot_part = partinfo->pi_PartitionTupleSlot;
+                   remoteslot_part = partrelinfo_new->ri_PartitionTupleSlot;
                    if (remoteslot_part == NULL)
                        remoteslot_part = table_slot_create(partrel,
                                                            &estate->es_tupleTable);
-                   map = partinfo->pi_RootToPartitionMap;
+                   map = partrelinfo_new->ri_RootToPartitionMap;
                    if (map != NULL)
                    {
                        remoteslot_part = execute_attr_map_slot(map->attrMap,
index 74c39911b2a2a0c3397042586b9ae4e6673bcb1a..473c4cd84fc64d4a8098c8afe6445a946e33a612 100644 (file)
 typedef struct PartitionDispatchData *PartitionDispatch;
 typedef struct PartitionTupleRouting PartitionTupleRouting;
 
-/*
- * PartitionRoutingInfo
- *
- * Additional result relation information specific to routing tuples to a
- * table partition.
- */
-typedef struct PartitionRoutingInfo
-{
-   /*
-    * Map for converting tuples in root partitioned table format into
-    * partition format, or NULL if no conversion is required.
-    */
-   TupleConversionMap *pi_RootToPartitionMap;
-
-   /*
-    * Slot to store tuples in partition format, or NULL when no translation
-    * is required between root and partition.
-    */
-   TupleTableSlot *pi_PartitionTupleSlot;
-} PartitionRoutingInfo;
-
 /*
  * PartitionedRelPruningData - Per-partitioned-table data for run-time pruning
  * of partitions.  For a multilevel partitioned table, we have one of these
index 46789cb00703ac1cbdc549cfeebd895b71708a75..6c0a7d68d61529218190ad918c45161cd221a39f 100644 (file)
@@ -33,7 +33,6 @@
 #include "utils/tuplestore.h"
 
 struct PlanState;              /* forward references in this file */
-struct PartitionRoutingInfo;
 struct ParallelHashJoinState;
 struct ExecRowMark;
 struct ExprState;
@@ -480,11 +479,17 @@ typedef struct ResultRelInfo
    /* partition check expression state (NULL if not set up yet) */
    ExprState  *ri_PartitionCheckExpr;
 
-   /* relation descriptor for partitioned table's root, if any */
+   /*
+    * Information needed by tuple routing target relations
+    *
+    * PartitionRoot gives the target relation mentioned in the query.
+    * RootToPartitionMap and PartitionTupleSlot, initialized by
+    * ExecInitRoutingInfo, are non-NULL if partition has a different tuple
+    * format than the root table.
+    */
    Relation    ri_PartitionRoot;
-
-   /* info for partition tuple routing (NULL if not set up yet) */
-   struct PartitionRoutingInfo *ri_PartitionInfo;
+   TupleConversionMap *ri_RootToPartitionMap;
+   TupleTableSlot *ri_PartitionTupleSlot;
 
    /*
     * Map to convert child result relation tuples to the format of the table