aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/copy.c')
-rw-r--r--src/backend/commands/copy.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 77a8631de12..071b97dee13 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -161,11 +161,14 @@ typedef struct CopyStateData
ExprState **defexprs; /* array of default att expressions */
bool volatile_defexprs; /* is any of defexprs volatile? */
List *range_table;
+
PartitionDispatch *partition_dispatch_info;
- int num_dispatch;
- int num_partitions;
- ResultRelInfo *partitions;
+ int num_dispatch; /* Number of entries in the above array */
+ int num_partitions; /* Number of members in the following
+ * arrays */
+ ResultRelInfo *partitions; /* Per partition result relation */
TupleConversionMap **partition_tupconv_maps;
+ TupleTableSlot *partition_tuple_slot;
/*
* These variables are used to reduce overhead in textual COPY FROM.
@@ -1409,6 +1412,7 @@ BeginCopy(ParseState *pstate,
PartitionDispatch *partition_dispatch_info;
ResultRelInfo *partitions;
TupleConversionMap **partition_tupconv_maps;
+ TupleTableSlot *partition_tuple_slot;
int num_parted,
num_partitions;
@@ -1416,12 +1420,14 @@ BeginCopy(ParseState *pstate,
&partition_dispatch_info,
&partitions,
&partition_tupconv_maps,
+ &partition_tuple_slot,
&num_parted, &num_partitions);
cstate->partition_dispatch_info = partition_dispatch_info;
cstate->num_dispatch = num_parted;
cstate->partitions = partitions;
cstate->num_partitions = num_partitions;
cstate->partition_tupconv_maps = partition_tupconv_maps;
+ cstate->partition_tuple_slot = partition_tuple_slot;
}
}
else
@@ -2436,15 +2442,6 @@ CopyFrom(CopyState cstate)
estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate);
/*
- * Initialize a dedicated slot to manipulate tuples of any given
- * partition's rowtype.
- */
- if (cstate->partition_dispatch_info)
- estate->es_partition_tuple_slot = ExecInitExtraTupleSlot(estate);
- else
- estate->es_partition_tuple_slot = NULL;
-
- /*
* It's more efficient to prepare a bunch of tuples for insertion, and
* insert them in one heap_multi_insert() call, than call heap_insert()
* separately for every tuple. However, we can't do that if there are
@@ -2591,7 +2588,7 @@ CopyFrom(CopyState cstate)
* we're finished dealing with the partition.
*/
oldslot = slot;
- slot = estate->es_partition_tuple_slot;
+ slot = cstate->partition_tuple_slot;
Assert(slot != NULL);
ExecSetSlotDescriptor(slot, RelationGetDescr(partrel));
ExecStoreTuple(tuple, slot, InvalidBuffer, true);
@@ -2756,6 +2753,9 @@ CopyFrom(CopyState cstate)
ExecCloseIndices(resultRelInfo);
heap_close(resultRelInfo->ri_RelationDesc, NoLock);
}
+
+ /* Release the standalone partition tuple descriptor */
+ ExecDropSingleTupleTableSlot(cstate->partition_tuple_slot);
}
FreeExecutorState(estate);