diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 8394402f096..df093da97c5 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -237,7 +237,7 @@ COPY { table_name [ ( COPY FREEZE on - a partitioned table. + a partitioned table or foreign table. This option is only allowed in COPY FROM. diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index 0cbd05f5602..b70f4691b72 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -740,6 +740,12 @@ CopyFrom(CopyFromState cstate) errmsg("cannot perform COPY FREEZE on a partitioned table"))); } + /* There's currently no support for COPY FREEZE on foreign tables. */ + if (cstate->rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot perform COPY FREEZE on a foreign table"))); + /* * Tolerate one registration for the benefit of FirstXactSnapshot. * Scan-bearing queries generally create at least two registrations, diff --git a/src/test/regress/expected/copy.out b/src/test/regress/expected/copy.out index f554d42c84c..e69e34c69b8 100644 --- a/src/test/regress/expected/copy.out +++ b/src/test/regress/expected/copy.out @@ -325,3 +325,11 @@ SELECT tableoid::regclass, id % 2 = 0 is_even, count(*) from parted_si GROUP BY (2 rows) DROP TABLE parted_si; +-- ensure COPY FREEZE errors for foreign tables +begin; +create foreign data wrapper copytest_wrapper; +create server copytest_server foreign data wrapper copytest_wrapper; +create foreign table copytest_foreign_table (a int) server copytest_server; +copy copytest_foreign_table from stdin (freeze); +ERROR: cannot perform COPY FREEZE on a foreign table +rollback; diff --git a/src/test/regress/sql/copy.sql b/src/test/regress/sql/copy.sql index f1699b66b04..895479d2d0f 100644 --- a/src/test/regress/sql/copy.sql +++ b/src/test/regress/sql/copy.sql @@ -348,3 +348,13 @@ COPY parted_si(id, data) FROM :'filename'; SELECT tableoid::regclass, id % 2 = 0 is_even, count(*) from parted_si GROUP BY 1, 2 ORDER BY 1; DROP TABLE parted_si; + +-- ensure COPY FREEZE errors for foreign tables +begin; +create foreign data wrapper copytest_wrapper; +create server copytest_server foreign data wrapper copytest_wrapper; +create foreign table copytest_foreign_table (a int) server copytest_server; +copy copytest_foreign_table from stdin (freeze); +1 +\. +rollback;