From: amit Date: Wed, 28 Dec 2016 10:28:37 +0900 Subject: [PATCH 2/3] No multi-insert and bulk-insert when COPYing into partitioned tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We might consider alleviating this restriction by allocating a BulkInsertState object and managing tuple-buffering per partition. Reported by: 高增琦, Venkata B Nagothi, Ragnar Ouchterlony Patch by: Amit Langote (with pointers from 高增琦) Reports: https://www.postgresql.org/message-id/CAFmBtr32FDOqofo8yG-4mjzL1HnYHxXK5S9OGFJ%3D%3DcJpgEW4vA%40mail.gmail.com https://www.postgresql.org/message-id/CAEyp7J9WiX0L3DoiNcRrY-9iyw%3DqP%2Bj%3DDLsAnNFF1xT2J1ggfQ%40mail.gmail.com https://www.postgresql.org/message-id/16d73804-c9cd-14c5-463e-5caad563ff77%40agama.tv --- src/backend/commands/copy.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index f56b2ac49b..9624c93f6b 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2296,7 +2296,7 @@ CopyFrom(CopyState cstate) ErrorContextCallback errcallback; CommandId mycid = GetCurrentCommandId(true); int hi_options = 0; /* start with default heap_insert options */ - BulkInsertState bistate; + BulkInsertState bistate = NULL; uint64 processed = 0; bool useHeapMultiInsert; int nBufferedTuples = 0; @@ -2455,8 +2455,8 @@ CopyFrom(CopyState cstate) if ((resultRelInfo->ri_TrigDesc != NULL && (resultRelInfo->ri_TrigDesc->trig_insert_before_row || resultRelInfo->ri_TrigDesc->trig_insert_instead_row)) || - cstate->partition_dispatch_info != NULL || - cstate->volatile_defexprs) + cstate->volatile_defexprs || + cstate->rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { useHeapMultiInsert = false; } @@ -2480,7 +2480,14 @@ CopyFrom(CopyState cstate) values = (Datum *) palloc(tupDesc->natts * sizeof(Datum)); nulls = (bool *) palloc(tupDesc->natts * sizeof(bool)); - bistate = GetBulkInsertState(); + /* + * FIXME: We don't engage the bulk-insert mode for partitioned tables, + * because the the heap relation is most likely change from one row to + * next due to tuple-routing. + */ + if (cstate->rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + bistate = GetBulkInsertState(); + econtext = GetPerTupleExprContext(estate); /* Set up callback to identify error line number */ @@ -2701,7 +2708,8 @@ CopyFrom(CopyState cstate) /* Done, clean up */ error_context_stack = errcallback.previous; - FreeBulkInsertState(bistate); + if (bistate != NULL) + FreeBulkInsertState(bistate); MemoryContextSwitchTo(oldcontext); -- 2.11.0 --------------36267A5A88CA9EA4AEC9E6E5 Content-Type: text/x-diff; name="0003-Support-bulk-insert-mode-for-partitioned-tables.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0003-Support-bulk-insert-mode-for-partitioned-tables.patch"