diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/heap/heapam.c | 11 | ||||
-rw-r--r-- | src/backend/commands/copy.c | 12 | ||||
-rw-r--r-- | src/include/access/heapam.h | 1 |
3 files changed, 24 insertions, 0 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 1ce42ea9702..5fd7f1e1a20 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -2324,6 +2324,17 @@ FreeBulkInsertState(BulkInsertState bistate) pfree(bistate); } +/* + * ReleaseBulkInsertStatePin - release a buffer currently held in bistate + */ +void +ReleaseBulkInsertStatePin(BulkInsertState bistate) +{ + if (bistate->current_buf != InvalidBuffer) + ReleaseBuffer(bistate->current_buf); + bistate->current_buf = InvalidBuffer; +} + /* * heap_insert - insert tuple into a heap diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index c05e14e26f7..6b199c122f1 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2307,6 +2307,7 @@ CopyFrom(CopyState cstate) uint64 processed = 0; bool useHeapMultiInsert; int nBufferedTuples = 0; + int prev_leaf_part_index = -1; #define MAX_BUFFERED_TUPLES 1000 HeapTuple *bufferedTuples = NULL; /* initialize to silence warning */ @@ -2562,6 +2563,17 @@ CopyFrom(CopyState cstate) leaf_part_index < cstate->num_partitions); /* + * If this tuple is mapped to a partition that is not same as the + * previous one, we'd better make the bulk insert mechanism gets a + * new buffer. + */ + if (prev_leaf_part_index != leaf_part_index) + { + ReleaseBulkInsertStatePin(bistate); + prev_leaf_part_index = leaf_part_index; + } + + /* * Save the old ResultRelInfo and switch to the one corresponding * to the selected partition. */ diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index ee7e05a3ec7..a864f7860d8 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -147,6 +147,7 @@ extern void setLastTid(const ItemPointer tid); extern BulkInsertState GetBulkInsertState(void); extern void FreeBulkInsertState(BulkInsertState); +extern void ReleaseBulkInsertStatePin(BulkInsertState bistate); extern Oid heap_insert(Relation relation, HeapTuple tup, CommandId cid, int options, BulkInsertState bistate); |