diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index c2a0180156c..21e6486db68 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -565,6 +565,19 @@ CopyMultiInsertBufferCleanup(CopyMultiInsertInfo *miinfo, for (i = 0; i < MAX_BUFFERED_TUPLES && buffer->slots[i] != NULL; i++) ExecDropSingleTupleTableSlot(buffer->slots[i]); + if (RelationIsNonblockRelation(buffer->resultRelInfo->ri_RelationDesc)) + { + /* + * CBDB: do not call table_finish_bulk_insert for AO/AOCO or PAX tables. + * https://github.com/cloudberrydb/cloudberrydb/issues/547 + * Do not clean up context or resource here, table_finish_bulk_insert + * routine will be called more than once during COPY FROM if + * the partition buffer is flushed but COPY is not finished. + */ + pfree(buffer); + return; + } + table_finish_bulk_insert(buffer->resultRelInfo->ri_RelationDesc, miinfo->ti_options); @@ -2531,9 +2544,6 @@ CopyFrom(CopyFromState cstate) FreeExecutorState(estate); - /* GPDB_14_MERGE_FIXME: Do we need to call table_finish_bulk_insert here? */ - table_finish_bulk_insert(cstate->rel, ti_options); - return processed; } diff --git a/src/test/regress/data/partition_copy.csv b/src/test/regress/data/partition_copy.csv new file mode 100644 index 00000000000..b24be941fc0 --- /dev/null +++ b/src/test/regress/data/partition_copy.csv @@ -0,0 +1,1001 @@ +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 1 +2, 2 +2, 3 +2, 4 +2, 5 +2, 6 +2, 7 +2, 8 +2, 9 +2, 10 +2, 11 +2, 12 +2, 13 +2, 14 +2, 15 +2, 16 +2, 17 +2, 18 +2, 19 +2, 20 +2, 21 +2, 22 +2, 23 +2, 24 +2, 25 +2, 26 +2, 27 +2, 28 +2, 29 +2, 30 +2, 31 +2, 32 +2, 33 +2, 1 \ No newline at end of file diff --git a/src/test/regress/expected/partition.out b/src/test/regress/expected/partition.out index 6d9bab04db8..f21df6bacfa 100755 --- a/src/test/regress/expected/partition.out +++ b/src/test/regress/expected/partition.out @@ -5921,3 +5921,27 @@ RESET ROLE; DROP TABLE public.t_part_acl; ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM user_prt_acl; DROP ROLE user_prt_acl; +-- +-- Github issue: https://github.com/cloudberrydb/cloudberrydb/issues/547 +-- Test COPY FROM on partitions tables. +-- +create table t_issue_547_aoco(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_column distributed by (a); +\copy t_issue_547_aoco from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_aoco; +select count(*) from t_issue_547_aoco; + count +------- + 1001 +(1 row) + +create table t_issue_547_ao(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_row distributed by (a); +\copy t_issue_547_ao from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_ao; +select count(*) from t_issue_547_ao; + count +------- + 1001 +(1 row) + +drop table t_issue_547_aoco; +drop table t_issue_547_ao; diff --git a/src/test/regress/expected/partition_optimizer.out b/src/test/regress/expected/partition_optimizer.out index b04c3baaeca..056941be202 100755 --- a/src/test/regress/expected/partition_optimizer.out +++ b/src/test/regress/expected/partition_optimizer.out @@ -5921,3 +5921,27 @@ RESET ROLE; DROP TABLE public.t_part_acl; ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM user_prt_acl; DROP ROLE user_prt_acl; +-- +-- Github issue: https://github.com/cloudberrydb/cloudberrydb/issues/547 +-- Test COPY FROM on partitions tables. +-- +create table t_issue_547_aoco(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_column distributed by (a); +\copy t_issue_547_aoco from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_aoco; +select count(*) from t_issue_547_aoco; + count +------- + 1001 +(1 row) + +create table t_issue_547_ao(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_row distributed by (a); +\copy t_issue_547_ao from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_ao; +select count(*) from t_issue_547_ao; + count +------- + 1001 +(1 row) + +drop table t_issue_547_aoco; +drop table t_issue_547_ao; diff --git a/src/test/regress/sql/partition.sql b/src/test/regress/sql/partition.sql index 5a9795209e5..7181b2cfcd2 100644 --- a/src/test/regress/sql/partition.sql +++ b/src/test/regress/sql/partition.sql @@ -3793,3 +3793,20 @@ RESET ROLE; DROP TABLE public.t_part_acl; ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM user_prt_acl; DROP ROLE user_prt_acl; + +-- +-- Github issue: https://github.com/cloudberrydb/cloudberrydb/issues/547 +-- Test COPY FROM on partitions tables. +-- +create table t_issue_547_aoco(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_column distributed by (a); +\copy t_issue_547_aoco from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_aoco; +select count(*) from t_issue_547_aoco; + +create table t_issue_547_ao(a int, b int) partition by range(b) (start(1) end(34) every(1)) using ao_row distributed by (a); +\copy t_issue_547_ao from 'data/partition_copy.csv' (format csv); +analyze t_issue_547_ao; +select count(*) from t_issue_547_ao; + +drop table t_issue_547_aoco; +drop table t_issue_547_ao;