aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/copy.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index f1161f0fee1..c4dfbdacdf3 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2518,7 +2518,8 @@ CopyMultiInsertBufferFlush(CopyMultiInsertInfo *miinfo,
* The buffer must be flushed before cleanup.
*/
static inline void
-CopyMultiInsertBufferCleanup(CopyMultiInsertBuffer *buffer)
+CopyMultiInsertBufferCleanup(CopyMultiInsertInfo *miinfo,
+ CopyMultiInsertBuffer *buffer)
{
int i;
@@ -2534,6 +2535,9 @@ CopyMultiInsertBufferCleanup(CopyMultiInsertBuffer *buffer)
for (i = 0; i < MAX_BUFFERED_TUPLES && buffer->slots[i] != NULL; i++)
ExecDropSingleTupleTableSlot(buffer->slots[i]);
+ table_finish_bulk_insert(buffer->resultRelInfo->ri_RelationDesc,
+ miinfo->ti_options);
+
pfree(buffer);
}
@@ -2585,7 +2589,7 @@ CopyMultiInsertInfoFlush(CopyMultiInsertInfo *miinfo, ResultRelInfo *curr_rri)
buffer = (CopyMultiInsertBuffer *) linitial(miinfo->multiInsertBuffers);
}
- CopyMultiInsertBufferCleanup(buffer);
+ CopyMultiInsertBufferCleanup(miinfo, buffer);
miinfo->multiInsertBuffers = list_delete_first(miinfo->multiInsertBuffers);
}
}
@@ -2599,7 +2603,7 @@ CopyMultiInsertInfoCleanup(CopyMultiInsertInfo *miinfo)
ListCell *lc;
foreach(lc, miinfo->multiInsertBuffers)
- CopyMultiInsertBufferCleanup(lfirst(lc));
+ CopyMultiInsertBufferCleanup(miinfo, lfirst(lc));
list_free(miinfo->multiInsertBuffers);
}
@@ -3321,9 +3325,6 @@ CopyFrom(CopyState cstate)
{
if (!CopyMultiInsertInfoIsEmpty(&multiInsertInfo))
CopyMultiInsertInfoFlush(&multiInsertInfo, NULL);
-
- /* Tear down the multi-insert buffer data */
- CopyMultiInsertInfoCleanup(&multiInsertInfo);
}
/* Done, clean up */
@@ -3366,7 +3367,13 @@ CopyFrom(CopyState cstate)
FreeExecutorState(estate);
- table_finish_bulk_insert(cstate->rel, ti_options);
+ if (insertMethod != CIM_SINGLE)
+ {
+ table_finish_bulk_insert(cstate->rel, ti_options);
+
+ /* Tear down the multi-insert buffer data */
+ CopyMultiInsertInfoCleanup(&multiInsertInfo);
+ }
return processed;
}