aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2016-12-22 17:31:52 -0500
committerRobert Haas <rhaas@postgresql.org>2016-12-22 17:36:37 -0500
commit2ac3ef7a01df859c62d0a02333b646d65eaec5ff (patch)
tree850532b8c6aac27df50cff9c45a5873b4c0da743 /src/include
parent12bd7dd317e8f4346fb3507578aca790ede6ebea (diff)
downloadpostgresql-2ac3ef7a01df859c62d0a02333b646d65eaec5ff.tar.gz
postgresql-2ac3ef7a01df859c62d0a02333b646d65eaec5ff.zip
Fix tuple routing in cases where tuple descriptors don't match.
The previous coding failed to work correctly when we have a multi-level partitioned hierarchy where tables at successive levels have different attribute numbers for the partition key attributes. To fix, have each PartitionDispatch object store a standalone TupleTableSlot initialized with the TupleDesc of the corresponding partitioned table, along with a TupleConversionMap to map tuples from the its parent's rowtype to own rowtype. After tuple routing chooses a leaf partition, we must use the leaf partition's tuple descriptor, not the root table's. To that end, a dedicated TupleTableSlot for tuple routing is now allocated in EState. Amit Langote
Diffstat (limited to 'src/include')
-rw-r--r--src/include/catalog/partition.h7
-rw-r--r--src/include/nodes/execnodes.h3
2 files changed, 10 insertions, 0 deletions
diff --git a/src/include/catalog/partition.h b/src/include/catalog/partition.h
index 21effbf87b4..bf38df5d29e 100644
--- a/src/include/catalog/partition.h
+++ b/src/include/catalog/partition.h
@@ -47,6 +47,11 @@ typedef struct PartitionDescData *PartitionDesc;
* key Partition key information of the table
* keystate Execution state required for expressions in the partition key
* partdesc Partition descriptor of the table
+ * tupslot A standalone TupleTableSlot initialized with this table's tuple
+ * descriptor
+ * tupmap TupleConversionMap to convert from the parent's rowtype to
+ * this table's rowtype (when extracting the partition key of a
+ * tuple just before routing it through this table)
* indexes Array with partdesc->nparts members (for details on what
* individual members represent, see how they are set in
* RelationGetPartitionDispatchInfo())
@@ -58,6 +63,8 @@ typedef struct PartitionDispatchData
PartitionKey key;
List *keystate; /* list of ExprState */
PartitionDesc partdesc;
+ TupleTableSlot *tupslot;
+ TupleConversionMap *tupmap;
int *indexes;
} PartitionDispatchData;
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index cc0821bcac9..d43ec56a2b3 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -384,6 +384,9 @@ typedef struct EState
TupleTableSlot *es_trig_oldtup_slot; /* for TriggerEnabled */
TupleTableSlot *es_trig_newtup_slot; /* for TriggerEnabled */
+ /* Slot used to manipulate a tuple after it is routed to a partition */
+ TupleTableSlot *es_partition_tuple_slot;
+
/* Parameter info: */
ParamListInfo es_param_list_info; /* values of external params */
ParamExecData *es_param_exec_vals; /* values of internal params */