On 2016/12/27 18:48, 高增琦 wrote: > Hi , > > I tried "COPY FROM" in the git version. It inserts rows to wrong partition. > > step to reproduce: > create table t(a int, b int) partition by range(a); > create table t_p1 partition of t for values from (1) to (100); > create table t_p2 partition of t for values from (100) to (200); > create table t_p3 partition of t for values from (200) to (300); > insert into t values(1,1); > insert into t values(101,101); > insert into t values(201,201); > copy (select * from t) to '/tmp/test2.txt'; > copy t from '/tmp/test2.txt'; > select * from t_p1; > > result: > postgres=# select * from t_p1; > a | b > -----+----- > 1 | 1 > 1 | 1 > 101 | 101 > 201 | 201 > (4 rows) > > I think the argument "BulkInsertState" used in CopyFrom/heap_insert > is related to this problem. Please check it.
You're quite right. Attached should fix that. Thanks, Amit
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index aa25a23336..e9bf4afa44 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2290,7 +2290,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; @@ -2482,7 +2482,8 @@ CopyFrom(CopyState cstate) values = (Datum *) palloc(tupDesc->natts * sizeof(Datum)); nulls = (bool *) palloc(tupDesc->natts * sizeof(bool)); - bistate = GetBulkInsertState(); + if (useHeapMultiInsert) + bistate = GetBulkInsertState(); econtext = GetPerTupleExprContext(estate); /* Set up callback to identify error line number */ @@ -2707,7 +2708,8 @@ CopyFrom(CopyState cstate) /* Done, clean up */ error_context_stack = errcallback.previous; - FreeBulkInsertState(bistate); + if (bistate != NULL) + FreeBulkInsertState(bistate); MemoryContextSwitchTo(oldcontext);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers