summaryrefslogtreecommitdiff
path: root/src/include/executor/execPartition.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/executor/execPartition.h')
-rw-r--r--src/include/executor/execPartition.h34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h
index b5df357acdf..18e08129f84 100644
--- a/src/include/executor/execPartition.h
+++ b/src/include/executor/execPartition.h
@@ -62,11 +62,24 @@ typedef struct PartitionDispatchData *PartitionDispatch;
* for every leaf partition in the partition tree.
* num_partitions Number of leaf partitions in the partition tree
* (= 'partitions' array length)
- * partition_tupconv_maps Array of TupleConversionMap objects with one
+ * parent_child_tupconv_maps Array of TupleConversionMap objects with one
* entry for every leaf partition (required to
- * convert input tuple based on the root table's
- * rowtype to a leaf partition's rowtype after
- * tuple routing is done)
+ * convert tuple from the root table's rowtype to
+ * a leaf partition's rowtype after tuple routing
+ * is done)
+ * child_parent_tupconv_maps Array of TupleConversionMap objects with one
+ * entry for every leaf partition (required to
+ * convert an updated tuple from the leaf
+ * partition's rowtype to the root table's rowtype
+ * so that tuple routing can be done)
+ * child_parent_map_not_required Array of bool. True value means that a map is
+ * determined to be not required for the given
+ * partition. False means either we haven't yet
+ * checked if a map is required, or it was
+ * determined to be required.
+ * subplan_partition_offsets Integer array ordered by UPDATE subplans. Each
+ * element of this array has the index into the
+ * corresponding partition in partitions array.
* partition_tuple_slot TupleTableSlot to be used to manipulate any
* given leaf partition's rowtype after that
* partition is chosen for insertion by
@@ -79,8 +92,12 @@ typedef struct PartitionTupleRouting
int num_dispatch;
ResultRelInfo **partitions;
int num_partitions;
- TupleConversionMap **partition_tupconv_maps;
+ TupleConversionMap **parent_child_tupconv_maps;
+ TupleConversionMap **child_parent_tupconv_maps;
+ bool *child_parent_map_not_required;
+ int *subplan_partition_offsets;
TupleTableSlot *partition_tuple_slot;
+ TupleTableSlot *root_tuple_slot;
} PartitionTupleRouting;
extern PartitionTupleRouting *ExecSetupPartitionTupleRouting(ModifyTableState *mtstate,
@@ -90,6 +107,13 @@ extern int ExecFindPartition(ResultRelInfo *resultRelInfo,
PartitionDispatch *pd,
TupleTableSlot *slot,
EState *estate);
+extern void ExecSetupChildParentMapForLeaf(PartitionTupleRouting *proute);
+extern TupleConversionMap *TupConvMapForLeaf(PartitionTupleRouting *proute,
+ ResultRelInfo *rootRelInfo, int leaf_index);
+extern HeapTuple ConvertPartitionTupleSlot(TupleConversionMap *map,
+ HeapTuple tuple,
+ TupleTableSlot *new_slot,
+ TupleTableSlot **p_my_slot);
extern void ExecCleanupTupleRouting(PartitionTupleRouting *proute);
#endif /* EXECPARTITION_H */