Add error about the use of FREEZE in COPY TO

Also clarify some other error wording.

Reported-by: Kyotaro Horiguchi

Discussion: https://postgr.es/m/20220802.133046.1941977979333284049.horikyota.ntt@gmail.com

Backpatch-through: master
This commit is contained in:
Bruce Momjian 2023-11-13 12:53:03 -05:00
parent 103ed24e31
commit acc95f29ef
3 changed files with 26 additions and 19 deletions

View File

@ -224,6 +224,7 @@ COPY { <replaceable class="parameter">table_name</replaceable> [ ( <replaceable
open and there are no older snapshots held by this transaction. It is open and there are no older snapshots held by this transaction. It is
currently not possible to perform a <command>COPY FREEZE</command> on currently not possible to perform a <command>COPY FREEZE</command> on
a partitioned table. a partitioned table.
This option is only allowed in <command>COPY FROM</command>.
</para> </para>
<para> <para>
Note that all other sessions will immediately be able to see the data Note that all other sessions will immediately be able to see the data

View File

@ -671,7 +671,7 @@ ProcessCopyOptions(ParseState *pstate,
if (!opts_out->csv_mode && opts_out->quote != NULL) if (!opts_out->csv_mode && opts_out->quote != NULL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY quote available only in CSV mode"))); errmsg("COPY QUOTE requires CSV mode")));
if (opts_out->csv_mode && strlen(opts_out->quote) != 1) if (opts_out->csv_mode && strlen(opts_out->quote) != 1)
ereport(ERROR, ereport(ERROR,
@ -687,7 +687,7 @@ ProcessCopyOptions(ParseState *pstate,
if (!opts_out->csv_mode && opts_out->escape != NULL) if (!opts_out->csv_mode && opts_out->escape != NULL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY escape available only in CSV mode"))); errmsg("COPY ESCAPE requires CSV mode")));
if (opts_out->csv_mode && strlen(opts_out->escape) != 1) if (opts_out->csv_mode && strlen(opts_out->escape) != 1)
ereport(ERROR, ereport(ERROR,
@ -698,46 +698,52 @@ ProcessCopyOptions(ParseState *pstate,
if (!opts_out->csv_mode && (opts_out->force_quote || opts_out->force_quote_all)) if (!opts_out->csv_mode && (opts_out->force_quote || opts_out->force_quote_all))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY force quote available only in CSV mode"))); errmsg("COPY FORCE_QUOTE requires CSV mode")));
if ((opts_out->force_quote || opts_out->force_quote_all) && is_from) if ((opts_out->force_quote || opts_out->force_quote_all) && is_from)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY force quote only available using COPY TO"))); errmsg("COPY FORCE_QUOTE cannot be used with COPY FROM")));
/* Check force_notnull */ /* Check force_notnull */
if (!opts_out->csv_mode && opts_out->force_notnull != NIL) if (!opts_out->csv_mode && opts_out->force_notnull != NIL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY force not null available only in CSV mode"))); errmsg("COPY FORCE_NOT_NULL requires CSV mode")));
if (opts_out->force_notnull != NIL && !is_from) if (opts_out->force_notnull != NIL && !is_from)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("COPY force not null only available using COPY FROM"))); errmsg("COPY FORCE_NOT_NULL cannot be used with COPY TO")));
/* Check force_null */ /* Check force_null */
if (!opts_out->csv_mode && opts_out->force_null != NIL) if (!opts_out->csv_mode && opts_out->force_null != NIL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY force null available only in CSV mode"))); errmsg("COPY FORCE_NULL requires CSV mode")));
if (opts_out->force_null != NIL && !is_from) if (opts_out->force_null != NIL && !is_from)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("COPY force null only available using COPY FROM"))); errmsg("COPY FORCE_NULL cannot be used with COPY TO")));
/* Don't allow the delimiter to appear in the null string. */ /* Don't allow the delimiter to appear in the null string. */
if (strchr(opts_out->null_print, opts_out->delim[0]) != NULL) if (strchr(opts_out->null_print, opts_out->delim[0]) != NULL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("COPY delimiter must not appear in the NULL specification"))); errmsg("COPY delimiter character must not appear in the NULL specification")));
/* Don't allow the CSV quote char to appear in the null string. */ /* Don't allow the CSV quote char to appear in the null string. */
if (opts_out->csv_mode && if (opts_out->csv_mode &&
strchr(opts_out->null_print, opts_out->quote[0]) != NULL) strchr(opts_out->null_print, opts_out->quote[0]) != NULL)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("CSV quote character must not appear in the NULL specification"))); errmsg("CSV quote character must not appear in the NULL specification")));
/* Check freeze */
if (opts_out->freeze && !is_from)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("COPY FREEZE cannot be used with COPY TO")));
if (opts_out->default_print) if (opts_out->default_print)
{ {
if (!is_from) if (!is_from)

View File

@ -83,17 +83,17 @@ ERROR: cannot specify DELIMITER in BINARY mode
COPY x to stdin (format BINARY, null 'x'); COPY x to stdin (format BINARY, null 'x');
ERROR: cannot specify NULL in BINARY mode ERROR: cannot specify NULL in BINARY mode
COPY x to stdin (format TEXT, force_quote(a)); COPY x to stdin (format TEXT, force_quote(a));
ERROR: COPY force quote available only in CSV mode ERROR: COPY FORCE_QUOTE requires CSV mode
COPY x from stdin (format CSV, force_quote(a)); COPY x from stdin (format CSV, force_quote(a));
ERROR: COPY force quote only available using COPY TO ERROR: COPY FORCE_QUOTE cannot be used with COPY FROM
COPY x to stdout (format TEXT, force_not_null(a)); COPY x to stdout (format TEXT, force_not_null(a));
ERROR: COPY force not null available only in CSV mode ERROR: COPY FORCE_NOT_NULL requires CSV mode
COPY x to stdin (format CSV, force_not_null(a)); COPY x to stdin (format CSV, force_not_null(a));
ERROR: COPY force not null only available using COPY FROM ERROR: COPY FORCE_NOT_NULL cannot be used with COPY TO
COPY x to stdout (format TEXT, force_null(a)); COPY x to stdout (format TEXT, force_null(a));
ERROR: COPY force null available only in CSV mode ERROR: COPY FORCE_NULL requires CSV mode
COPY x to stdin (format CSV, force_null(a)); COPY x to stdin (format CSV, force_null(a));
ERROR: COPY force null only available using COPY FROM ERROR: COPY FORCE_NULL cannot be used with COPY TO
-- too many columns in column list: should fail -- too many columns in column list: should fail
COPY x (a, b, c, d, e, d, c) from stdin; COPY x (a, b, c, d, e, d, c) from stdin;
ERROR: column "d" specified more than once ERROR: column "d" specified more than once