1 /*-------------------------------------------------------------------------
4 * Implements the COPY utility command
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/backend/commands/copy.c
13 *-------------------------------------------------------------------------
21 #include "access/sysattr.h"
22 #include "access/table.h"
23 #include "access/xact.h"
24 #include "catalog/pg_authid.h"
25 #include "commands/copy.h"
26 #include "commands/defrem.h"
27 #include "executor/executor.h"
28 #include "mb/pg_wchar.h"
29 #include "miscadmin.h"
30 #include "nodes/makefuncs.h"
31 #include "optimizer/optimizer.h"
32 #include "parser/parse_coerce.h"
33 #include "parser/parse_collate.h"
34 #include "parser/parse_expr.h"
35 #include "parser/parse_relation.h"
36 #include "utils/acl.h"
37 #include "utils/builtins.h"
38 #include "utils/lsyscache.h"
39 #include "utils/rel.h"
40 #include "utils/rls.h"
43 * DoCopy executes the SQL COPY statement
45 * Either unload or reload contents of table <relation>, depending on <from>.
46 * (<from> = true means we are inserting into the table.) In the "TO" case
47 * we also support copying the output of an arbitrary SELECT, INSERT, UPDATE
50 * If <pipe> is false, transfer is between the table and the file named
51 * <filename>. Otherwise, transfer is between the table and our regular
52 * input/output stream. The latter could be either stdin/stdout or a
53 * socket, depending on whether we're running under Postmaster control.
55 * Do not allow a Postgres user without the 'pg_read_server_files' or
56 * 'pg_write_server_files' role to read from or write to a file.
58 * Do not allow the copy if user doesn't have proper permission to access
59 * the table or the specifically requested columns.
62 DoCopy(ParseState
*pstate
, const CopyStmt
*stmt
,
63 int stmt_location
, int stmt_len
,
66 bool is_from
= stmt
->is_from
;
67 bool pipe
= (stmt
->filename
== NULL
);
70 RawStmt
*query
= NULL
;
71 Node
*whereClause
= NULL
;
74 * Disallow COPY to/from file or program except to users with the
81 if (!has_privs_of_role(GetUserId(), ROLE_PG_EXECUTE_SERVER_PROGRAM
))
83 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE
),
84 errmsg("permission denied to COPY to or from an external program"),
85 errdetail("Only roles with privileges of the \"%s\" role may COPY to or from an external program.",
86 "pg_execute_server_program"),
87 errhint("Anyone can COPY to stdout or from stdin. "
88 "psql's \\copy command also works for anyone.")));
92 if (is_from
&& !has_privs_of_role(GetUserId(), ROLE_PG_READ_SERVER_FILES
))
94 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE
),
95 errmsg("permission denied to COPY from a file"),
96 errdetail("Only roles with privileges of the \"%s\" role may COPY from a file.",
97 "pg_read_server_files"),
98 errhint("Anyone can COPY to stdout or from stdin. "
99 "psql's \\copy command also works for anyone.")));
101 if (!is_from
&& !has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES
))
103 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE
),
104 errmsg("permission denied to COPY to a file"),
105 errdetail("Only roles with privileges of the \"%s\" role may COPY to a file.",
106 "pg_write_server_files"),
107 errhint("Anyone can COPY to stdout or from stdin. "
108 "psql's \\copy command also works for anyone.")));
114 LOCKMODE lockmode
= is_from
? RowExclusiveLock
: AccessShareLock
;
115 ParseNamespaceItem
*nsitem
;
116 RTEPermissionInfo
*perminfo
;
121 Assert(!stmt
->query
);
123 /* Open and lock the relation, using the appropriate lock type. */
124 rel
= table_openrv(stmt
->relation
, lockmode
);
126 relid
= RelationGetRelid(rel
);
128 nsitem
= addRangeTableEntryForRelation(pstate
, rel
, lockmode
,
131 perminfo
= nsitem
->p_perminfo
;
132 perminfo
->requiredPerms
= (is_from
? ACL_INSERT
: ACL_SELECT
);
134 if (stmt
->whereClause
)
136 /* add nsitem to query namespace */
137 addNSItemToQuery(pstate
, nsitem
, false, true, true);
139 /* Transform the raw expression tree */
140 whereClause
= transformExpr(pstate
, stmt
->whereClause
, EXPR_KIND_COPY_WHERE
);
142 /* Make sure it yields a boolean result. */
143 whereClause
= coerce_to_boolean(pstate
, whereClause
, "WHERE");
145 /* we have to fix its collations too */
146 assign_expr_collations(pstate
, whereClause
);
148 whereClause
= eval_const_expressions(NULL
, whereClause
);
150 whereClause
= (Node
*) canonicalize_qual((Expr
*) whereClause
, false);
151 whereClause
= (Node
*) make_ands_implicit((Expr
*) whereClause
);
154 tupDesc
= RelationGetDescr(rel
);
155 attnums
= CopyGetAttnums(tupDesc
, rel
, stmt
->attlist
);
156 foreach(cur
, attnums
)
161 attno
= lfirst_int(cur
) - FirstLowInvalidHeapAttributeNumber
;
162 bms
= is_from
? &perminfo
->insertedCols
: &perminfo
->selectedCols
;
164 *bms
= bms_add_member(*bms
, attno
);
166 ExecCheckPermissions(pstate
->p_rtable
, list_make1(perminfo
), true);
169 * Permission check for row security policies.
171 * check_enable_rls will ereport(ERROR) if the user has requested
172 * something invalid and will otherwise indicate if we should enable
173 * RLS (returns RLS_ENABLED) or not for this COPY statement.
175 * If the relation has a row security policy and we are to apply it
176 * then perform a "query" copy and allow the normal query processing
177 * to handle the policies.
179 * If RLS is not enabled for this, then just fall through to the
180 * normal non-filtering relation handling.
182 if (check_enable_rls(relid
, InvalidOid
, false) == RLS_ENABLED
)
188 List
*targetList
= NIL
;
192 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
193 errmsg("COPY FROM not supported with row-level security"),
194 errhint("Use INSERT statements instead.")));
199 * If no columns are specified in the attribute list of the COPY
200 * command, then the target list is 'all' columns. Therefore, '*'
201 * should be used as the target list for the resulting SELECT
204 * In the case that columns are specified in the attribute list,
205 * create a ColumnRef and ResTarget for each column and add them
206 * to the target list for the resulting SELECT statement.
210 cr
= makeNode(ColumnRef
);
211 cr
->fields
= list_make1(makeNode(A_Star
));
214 target
= makeNode(ResTarget
);
216 target
->indirection
= NIL
;
217 target
->val
= (Node
*) cr
;
218 target
->location
= -1;
220 targetList
= list_make1(target
);
226 foreach(lc
, stmt
->attlist
)
229 * Build the ColumnRef for each column. The ColumnRef
230 * 'fields' property is a String node that corresponds to
231 * the column name respectively.
233 cr
= makeNode(ColumnRef
);
234 cr
->fields
= list_make1(lfirst(lc
));
237 /* Build the ResTarget and add the ColumnRef to it. */
238 target
= makeNode(ResTarget
);
240 target
->indirection
= NIL
;
241 target
->val
= (Node
*) cr
;
242 target
->location
= -1;
244 /* Add each column to the SELECT statement's target list */
245 targetList
= lappend(targetList
, target
);
250 * Build RangeVar for from clause, fully qualified based on the
251 * relation which we have opened and locked. Use "ONLY" so that
252 * COPY retrieves rows from only the target table not any
253 * inheritance children, the same as when RLS doesn't apply.
255 from
= makeRangeVar(get_namespace_name(RelationGetNamespace(rel
)),
256 pstrdup(RelationGetRelationName(rel
)),
258 from
->inh
= false; /* apply ONLY */
261 select
= makeNode(SelectStmt
);
262 select
->targetList
= targetList
;
263 select
->fromClause
= list_make1(from
);
265 query
= makeNode(RawStmt
);
266 query
->stmt
= (Node
*) select
;
267 query
->stmt_location
= stmt_location
;
268 query
->stmt_len
= stmt_len
;
271 * Close the relation for now, but keep the lock on it to prevent
272 * changes between now and when we start the query-based COPY.
274 * We'll reopen it later as part of the query-based COPY.
276 table_close(rel
, NoLock
);
284 query
= makeNode(RawStmt
);
285 query
->stmt
= stmt
->query
;
286 query
->stmt_location
= stmt_location
;
287 query
->stmt_len
= stmt_len
;
295 CopyFromState cstate
;
299 /* check read-only transaction and parallel mode */
300 if (XactReadOnly
&& !rel
->rd_islocaltemp
)
301 PreventCommandIfReadOnly("COPY FROM");
303 cstate
= BeginCopyFrom(pstate
, rel
, whereClause
,
304 stmt
->filename
, stmt
->is_program
,
305 NULL
, stmt
->attlist
, stmt
->options
);
306 *processed
= CopyFrom(cstate
); /* copy from file to database */
313 cstate
= BeginCopyTo(pstate
, rel
, query
, relid
,
314 stmt
->filename
, stmt
->is_program
,
315 NULL
, stmt
->attlist
, stmt
->options
);
316 *processed
= DoCopyTo(cstate
); /* copy from database to file */
321 table_close(rel
, NoLock
);
325 * Extract a CopyHeaderChoice value from a DefElem. This is like
326 * defGetBoolean() but also accepts the special value "match".
328 static CopyHeaderChoice
329 defGetCopyHeaderChoice(DefElem
*def
, bool is_from
)
332 * If no parameter value given, assume "true" is meant.
334 if (def
->arg
== NULL
)
335 return COPY_HEADER_TRUE
;
338 * Allow 0, 1, "true", "false", "on", "off", or "match".
340 switch (nodeTag(def
->arg
))
343 switch (intVal(def
->arg
))
346 return COPY_HEADER_FALSE
;
348 return COPY_HEADER_TRUE
;
350 /* otherwise, error out below */
356 char *sval
= defGetString(def
);
359 * The set of strings accepted here should match up with the
360 * grammar's opt_boolean_or_string production.
362 if (pg_strcasecmp(sval
, "true") == 0)
363 return COPY_HEADER_TRUE
;
364 if (pg_strcasecmp(sval
, "false") == 0)
365 return COPY_HEADER_FALSE
;
366 if (pg_strcasecmp(sval
, "on") == 0)
367 return COPY_HEADER_TRUE
;
368 if (pg_strcasecmp(sval
, "off") == 0)
369 return COPY_HEADER_FALSE
;
370 if (pg_strcasecmp(sval
, "match") == 0)
374 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
375 errmsg("cannot use \"%s\" with HEADER in COPY TO",
377 return COPY_HEADER_MATCH
;
383 (errcode(ERRCODE_SYNTAX_ERROR
),
384 errmsg("%s requires a Boolean value or \"match\"",
386 return COPY_HEADER_FALSE
; /* keep compiler quiet */
390 * Extract a CopyOnErrorChoice value from a DefElem.
392 static CopyOnErrorChoice
393 defGetCopyOnErrorChoice(DefElem
*def
, ParseState
*pstate
, bool is_from
)
395 char *sval
= defGetString(def
);
399 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
400 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
401 second %s is a COPY with direction, e.g. COPY TO */
402 errmsg("COPY %s cannot be used with %s", "ON_ERROR", "COPY TO"),
403 parser_errposition(pstate
, def
->location
)));
406 * Allow "stop", or "ignore" values.
408 if (pg_strcasecmp(sval
, "stop") == 0)
409 return COPY_ON_ERROR_STOP
;
410 if (pg_strcasecmp(sval
, "ignore") == 0)
411 return COPY_ON_ERROR_IGNORE
;
414 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
415 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */
416 errmsg("COPY %s \"%s\" not recognized", "ON_ERROR", sval
),
417 parser_errposition(pstate
, def
->location
)));
418 return COPY_ON_ERROR_STOP
; /* keep compiler quiet */
422 * Extract REJECT_LIMIT value from a DefElem.
424 * REJECT_LIMIT can be specified in two ways: as an int64 for the COPY command
425 * option or as a single-quoted string for the foreign table option using
426 * file_fdw. Therefore this function needs to handle both formats.
429 defGetCopyRejectLimitOption(DefElem
*def
)
433 if (def
->arg
== NULL
)
435 (errcode(ERRCODE_SYNTAX_ERROR
),
436 errmsg("%s requires a numeric value",
438 else if (nodeTag(def
->arg
) == T_String
)
439 reject_limit
= pg_strtoint64(strVal(def
->arg
));
441 reject_limit
= defGetInt64(def
);
443 if (reject_limit
<= 0)
445 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
446 errmsg("REJECT_LIMIT (%lld) must be greater than zero",
447 (long long) reject_limit
)));
453 * Extract a CopyLogVerbosityChoice value from a DefElem.
455 static CopyLogVerbosityChoice
456 defGetCopyLogVerbosityChoice(DefElem
*def
, ParseState
*pstate
)
461 * Allow "silent", "default", or "verbose" values.
463 sval
= defGetString(def
);
464 if (pg_strcasecmp(sval
, "silent") == 0)
465 return COPY_LOG_VERBOSITY_SILENT
;
466 if (pg_strcasecmp(sval
, "default") == 0)
467 return COPY_LOG_VERBOSITY_DEFAULT
;
468 if (pg_strcasecmp(sval
, "verbose") == 0)
469 return COPY_LOG_VERBOSITY_VERBOSE
;
472 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
473 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */
474 errmsg("COPY %s \"%s\" not recognized", "LOG_VERBOSITY", sval
),
475 parser_errposition(pstate
, def
->location
)));
476 return COPY_LOG_VERBOSITY_DEFAULT
; /* keep compiler quiet */
480 * Process the statement option list for COPY.
482 * Scan the options list (a list of DefElem) and transpose the information
483 * into *opts_out, applying appropriate error checking.
485 * If 'opts_out' is not NULL, it is assumed to be filled with zeroes initially.
487 * This is exported so that external users of the COPY API can sanity-check
488 * a list of options. In that usage, 'opts_out' can be passed as NULL and
489 * the collected data is just leaked until CurrentMemoryContext is reset.
491 * Note that additional checking, such as whether column names listed in FORCE
492 * QUOTE actually exist, has to be applied later. This just checks for
493 * self-consistency of the options list.
496 ProcessCopyOptions(ParseState
*pstate
,
497 CopyFormatOptions
*opts_out
,
501 bool format_specified
= false;
502 bool freeze_specified
= false;
503 bool header_specified
= false;
504 bool on_error_specified
= false;
505 bool log_verbosity_specified
= false;
506 bool reject_limit_specified
= false;
509 /* Support external use for option sanity checking */
510 if (opts_out
== NULL
)
511 opts_out
= (CopyFormatOptions
*) palloc0(sizeof(CopyFormatOptions
));
513 opts_out
->file_encoding
= -1;
515 /* Extract options from the statement node tree */
516 foreach(option
, options
)
518 DefElem
*defel
= lfirst_node(DefElem
, option
);
520 if (strcmp(defel
->defname
, "format") == 0)
522 char *fmt
= defGetString(defel
);
524 if (format_specified
)
525 errorConflictingDefElem(defel
, pstate
);
526 format_specified
= true;
527 if (strcmp(fmt
, "text") == 0)
528 /* default format */ ;
529 else if (strcmp(fmt
, "csv") == 0)
530 opts_out
->csv_mode
= true;
531 else if (strcmp(fmt
, "binary") == 0)
532 opts_out
->binary
= true;
535 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
536 errmsg("COPY format \"%s\" not recognized", fmt
),
537 parser_errposition(pstate
, defel
->location
)));
539 else if (strcmp(defel
->defname
, "freeze") == 0)
541 if (freeze_specified
)
542 errorConflictingDefElem(defel
, pstate
);
543 freeze_specified
= true;
544 opts_out
->freeze
= defGetBoolean(defel
);
546 else if (strcmp(defel
->defname
, "delimiter") == 0)
549 errorConflictingDefElem(defel
, pstate
);
550 opts_out
->delim
= defGetString(defel
);
552 else if (strcmp(defel
->defname
, "null") == 0)
554 if (opts_out
->null_print
)
555 errorConflictingDefElem(defel
, pstate
);
556 opts_out
->null_print
= defGetString(defel
);
558 else if (strcmp(defel
->defname
, "default") == 0)
560 if (opts_out
->default_print
)
561 errorConflictingDefElem(defel
, pstate
);
562 opts_out
->default_print
= defGetString(defel
);
564 else if (strcmp(defel
->defname
, "header") == 0)
566 if (header_specified
)
567 errorConflictingDefElem(defel
, pstate
);
568 header_specified
= true;
569 opts_out
->header_line
= defGetCopyHeaderChoice(defel
, is_from
);
571 else if (strcmp(defel
->defname
, "quote") == 0)
574 errorConflictingDefElem(defel
, pstate
);
575 opts_out
->quote
= defGetString(defel
);
577 else if (strcmp(defel
->defname
, "escape") == 0)
579 if (opts_out
->escape
)
580 errorConflictingDefElem(defel
, pstate
);
581 opts_out
->escape
= defGetString(defel
);
583 else if (strcmp(defel
->defname
, "force_quote") == 0)
585 if (opts_out
->force_quote
|| opts_out
->force_quote_all
)
586 errorConflictingDefElem(defel
, pstate
);
587 if (defel
->arg
&& IsA(defel
->arg
, A_Star
))
588 opts_out
->force_quote_all
= true;
589 else if (defel
->arg
&& IsA(defel
->arg
, List
))
590 opts_out
->force_quote
= castNode(List
, defel
->arg
);
593 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
594 errmsg("argument to option \"%s\" must be a list of column names",
596 parser_errposition(pstate
, defel
->location
)));
598 else if (strcmp(defel
->defname
, "force_not_null") == 0)
600 if (opts_out
->force_notnull
|| opts_out
->force_notnull_all
)
601 errorConflictingDefElem(defel
, pstate
);
602 if (defel
->arg
&& IsA(defel
->arg
, A_Star
))
603 opts_out
->force_notnull_all
= true;
604 else if (defel
->arg
&& IsA(defel
->arg
, List
))
605 opts_out
->force_notnull
= castNode(List
, defel
->arg
);
608 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
609 errmsg("argument to option \"%s\" must be a list of column names",
611 parser_errposition(pstate
, defel
->location
)));
613 else if (strcmp(defel
->defname
, "force_null") == 0)
615 if (opts_out
->force_null
|| opts_out
->force_null_all
)
616 errorConflictingDefElem(defel
, pstate
);
617 if (defel
->arg
&& IsA(defel
->arg
, A_Star
))
618 opts_out
->force_null_all
= true;
619 else if (defel
->arg
&& IsA(defel
->arg
, List
))
620 opts_out
->force_null
= castNode(List
, defel
->arg
);
623 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
624 errmsg("argument to option \"%s\" must be a list of column names",
626 parser_errposition(pstate
, defel
->location
)));
628 else if (strcmp(defel
->defname
, "convert_selectively") == 0)
631 * Undocumented, not-accessible-from-SQL option: convert only the
632 * named columns to binary form, storing the rest as NULLs. It's
633 * allowed for the column list to be NIL.
635 if (opts_out
->convert_selectively
)
636 errorConflictingDefElem(defel
, pstate
);
637 opts_out
->convert_selectively
= true;
638 if (defel
->arg
== NULL
|| IsA(defel
->arg
, List
))
639 opts_out
->convert_select
= castNode(List
, defel
->arg
);
642 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
643 errmsg("argument to option \"%s\" must be a list of column names",
645 parser_errposition(pstate
, defel
->location
)));
647 else if (strcmp(defel
->defname
, "encoding") == 0)
649 if (opts_out
->file_encoding
>= 0)
650 errorConflictingDefElem(defel
, pstate
);
651 opts_out
->file_encoding
= pg_char_to_encoding(defGetString(defel
));
652 if (opts_out
->file_encoding
< 0)
654 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
655 errmsg("argument to option \"%s\" must be a valid encoding name",
657 parser_errposition(pstate
, defel
->location
)));
659 else if (strcmp(defel
->defname
, "on_error") == 0)
661 if (on_error_specified
)
662 errorConflictingDefElem(defel
, pstate
);
663 on_error_specified
= true;
664 opts_out
->on_error
= defGetCopyOnErrorChoice(defel
, pstate
, is_from
);
666 else if (strcmp(defel
->defname
, "log_verbosity") == 0)
668 if (log_verbosity_specified
)
669 errorConflictingDefElem(defel
, pstate
);
670 log_verbosity_specified
= true;
671 opts_out
->log_verbosity
= defGetCopyLogVerbosityChoice(defel
, pstate
);
673 else if (strcmp(defel
->defname
, "reject_limit") == 0)
675 if (reject_limit_specified
)
676 errorConflictingDefElem(defel
, pstate
);
677 reject_limit_specified
= true;
678 opts_out
->reject_limit
= defGetCopyRejectLimitOption(defel
);
682 (errcode(ERRCODE_SYNTAX_ERROR
),
683 errmsg("option \"%s\" not recognized",
685 parser_errposition(pstate
, defel
->location
)));
689 * Check for incompatible options (must do these three before inserting
692 if (opts_out
->binary
&& opts_out
->delim
)
694 (errcode(ERRCODE_SYNTAX_ERROR
),
695 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
696 errmsg("cannot specify %s in BINARY mode", "DELIMITER")));
698 if (opts_out
->binary
&& opts_out
->null_print
)
700 (errcode(ERRCODE_SYNTAX_ERROR
),
701 errmsg("cannot specify %s in BINARY mode", "NULL")));
703 if (opts_out
->binary
&& opts_out
->default_print
)
705 (errcode(ERRCODE_SYNTAX_ERROR
),
706 errmsg("cannot specify %s in BINARY mode", "DEFAULT")));
708 /* Set defaults for omitted options */
709 if (!opts_out
->delim
)
710 opts_out
->delim
= opts_out
->csv_mode
? "," : "\t";
712 if (!opts_out
->null_print
)
713 opts_out
->null_print
= opts_out
->csv_mode
? "" : "\\N";
714 opts_out
->null_print_len
= strlen(opts_out
->null_print
);
716 if (opts_out
->csv_mode
)
718 if (!opts_out
->quote
)
719 opts_out
->quote
= "\"";
720 if (!opts_out
->escape
)
721 opts_out
->escape
= opts_out
->quote
;
724 /* Only single-byte delimiter strings are supported. */
725 if (strlen(opts_out
->delim
) != 1)
727 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
728 errmsg("COPY delimiter must be a single one-byte character")));
730 /* Disallow end-of-line characters */
731 if (strchr(opts_out
->delim
, '\r') != NULL
||
732 strchr(opts_out
->delim
, '\n') != NULL
)
734 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
735 errmsg("COPY delimiter cannot be newline or carriage return")));
737 if (strchr(opts_out
->null_print
, '\r') != NULL
||
738 strchr(opts_out
->null_print
, '\n') != NULL
)
740 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
741 errmsg("COPY null representation cannot use newline or carriage return")));
743 if (opts_out
->default_print
)
745 opts_out
->default_print_len
= strlen(opts_out
->default_print
);
747 if (strchr(opts_out
->default_print
, '\r') != NULL
||
748 strchr(opts_out
->default_print
, '\n') != NULL
)
750 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
751 errmsg("COPY default representation cannot use newline or carriage return")));
755 * Disallow unsafe delimiter characters in non-CSV mode. We can't allow
756 * backslash because it would be ambiguous. We can't allow the other
757 * cases because data characters matching the delimiter must be
758 * backslashed, and certain backslash combinations are interpreted
759 * non-literally by COPY IN. Disallowing all lower case ASCII letters is
760 * more than strictly necessary, but seems best for consistency and
761 * future-proofing. Likewise we disallow all digits though only octal
762 * digits are actually dangerous.
764 if (!opts_out
->csv_mode
&&
765 strchr("\\.abcdefghijklmnopqrstuvwxyz0123456789",
766 opts_out
->delim
[0]) != NULL
)
768 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
769 errmsg("COPY delimiter cannot be \"%s\"", opts_out
->delim
)));
772 if (opts_out
->binary
&& opts_out
->header_line
)
774 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
775 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
776 errmsg("cannot specify %s in BINARY mode", "HEADER")));
779 if (!opts_out
->csv_mode
&& opts_out
->quote
!= NULL
)
781 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
782 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
783 errmsg("COPY %s requires CSV mode", "QUOTE")));
785 if (opts_out
->csv_mode
&& strlen(opts_out
->quote
) != 1)
787 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
788 errmsg("COPY quote must be a single one-byte character")));
790 if (opts_out
->csv_mode
&& opts_out
->delim
[0] == opts_out
->quote
[0])
792 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
793 errmsg("COPY delimiter and quote must be different")));
796 if (!opts_out
->csv_mode
&& opts_out
->escape
!= NULL
)
798 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
799 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
800 errmsg("COPY %s requires CSV mode", "ESCAPE")));
802 if (opts_out
->csv_mode
&& strlen(opts_out
->escape
) != 1)
804 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
805 errmsg("COPY escape must be a single one-byte character")));
807 /* Check force_quote */
808 if (!opts_out
->csv_mode
&& (opts_out
->force_quote
|| opts_out
->force_quote_all
))
810 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
811 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
812 errmsg("COPY %s requires CSV mode", "FORCE_QUOTE")));
813 if ((opts_out
->force_quote
|| opts_out
->force_quote_all
) && is_from
)
815 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
816 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
817 second %s is a COPY with direction, e.g. COPY TO */
818 errmsg("COPY %s cannot be used with %s", "FORCE_QUOTE",
821 /* Check force_notnull */
822 if (!opts_out
->csv_mode
&& (opts_out
->force_notnull
!= NIL
||
823 opts_out
->force_notnull_all
))
825 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
826 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
827 errmsg("COPY %s requires CSV mode", "FORCE_NOT_NULL")));
828 if ((opts_out
->force_notnull
!= NIL
|| opts_out
->force_notnull_all
) &&
831 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
832 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
833 second %s is a COPY with direction, e.g. COPY TO */
834 errmsg("COPY %s cannot be used with %s", "FORCE_NOT_NULL",
837 /* Check force_null */
838 if (!opts_out
->csv_mode
&& (opts_out
->force_null
!= NIL
||
839 opts_out
->force_null_all
))
841 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
842 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
843 errmsg("COPY %s requires CSV mode", "FORCE_NULL")));
845 if ((opts_out
->force_null
!= NIL
|| opts_out
->force_null_all
) &&
848 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
849 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
850 second %s is a COPY with direction, e.g. COPY TO */
851 errmsg("COPY %s cannot be used with %s", "FORCE_NULL",
854 /* Don't allow the delimiter to appear in the null string. */
855 if (strchr(opts_out
->null_print
, opts_out
->delim
[0]) != NULL
)
857 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
858 /*- translator: %s is the name of a COPY option, e.g. NULL */
859 errmsg("COPY delimiter character must not appear in the %s specification",
862 /* Don't allow the CSV quote char to appear in the null string. */
863 if (opts_out
->csv_mode
&&
864 strchr(opts_out
->null_print
, opts_out
->quote
[0]) != NULL
)
866 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
867 /*- translator: %s is the name of a COPY option, e.g. NULL */
868 errmsg("CSV quote character must not appear in the %s specification",
872 if (opts_out
->freeze
&& !is_from
)
874 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
875 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
876 second %s is a COPY with direction, e.g. COPY TO */
877 errmsg("COPY %s cannot be used with %s", "FREEZE",
880 if (opts_out
->default_print
)
884 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
885 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
886 second %s is a COPY with direction, e.g. COPY TO */
887 errmsg("COPY %s cannot be used with %s", "DEFAULT",
890 /* Don't allow the delimiter to appear in the default string. */
891 if (strchr(opts_out
->default_print
, opts_out
->delim
[0]) != NULL
)
893 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
894 /*- translator: %s is the name of a COPY option, e.g. NULL */
895 errmsg("COPY delimiter character must not appear in the %s specification",
898 /* Don't allow the CSV quote char to appear in the default string. */
899 if (opts_out
->csv_mode
&&
900 strchr(opts_out
->default_print
, opts_out
->quote
[0]) != NULL
)
902 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
903 /*- translator: %s is the name of a COPY option, e.g. NULL */
904 errmsg("CSV quote character must not appear in the %s specification",
907 /* Don't allow the NULL and DEFAULT string to be the same */
908 if (opts_out
->null_print_len
== opts_out
->default_print_len
&&
909 strncmp(opts_out
->null_print
, opts_out
->default_print
,
910 opts_out
->null_print_len
) == 0)
912 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
913 errmsg("NULL specification and DEFAULT specification cannot be the same")));
916 if (opts_out
->binary
&& opts_out
->on_error
!= COPY_ON_ERROR_STOP
)
918 (errcode(ERRCODE_SYNTAX_ERROR
),
919 errmsg("only ON_ERROR STOP is allowed in BINARY mode")));
921 if (opts_out
->reject_limit
&& !opts_out
->on_error
)
923 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
924 /*- translator: first and second %s are the names of COPY option, e.g.
925 * ON_ERROR, third is the value of the COPY option, e.g. IGNORE */
926 errmsg("COPY %s requires %s to be set to %s",
927 "REJECT_LIMIT", "ON_ERROR", "IGNORE")));
931 * CopyGetAttnums - build an integer list of attnums to be copied
933 * The input attnamelist is either the user-specified column list,
934 * or NIL if there was none (in which case we want all the non-dropped
937 * We don't include generated columns in the generated full list and we don't
938 * allow them to be specified explicitly. They don't make sense for COPY
939 * FROM, but we could possibly allow them for COPY TO. But this way it's at
940 * least ensured that whatever we copy out can be copied back in.
942 * rel can be NULL ... it's only used for error reports.
945 CopyGetAttnums(TupleDesc tupDesc
, Relation rel
, List
*attnamelist
)
949 if (attnamelist
== NIL
)
951 /* Generate default column list */
952 int attr_count
= tupDesc
->natts
;
955 for (i
= 0; i
< attr_count
; i
++)
957 CompactAttribute
*attr
= TupleDescCompactAttr(tupDesc
, i
);
959 if (attr
->attisdropped
|| attr
->attgenerated
)
961 attnums
= lappend_int(attnums
, i
+ 1);
966 /* Validate the user-supplied list and extract attnums */
969 foreach(l
, attnamelist
)
971 char *name
= strVal(lfirst(l
));
975 /* Lookup column name */
976 attnum
= InvalidAttrNumber
;
977 for (i
= 0; i
< tupDesc
->natts
; i
++)
979 Form_pg_attribute att
= TupleDescAttr(tupDesc
, i
);
981 if (att
->attisdropped
)
983 if (namestrcmp(&(att
->attname
), name
) == 0)
985 if (att
->attgenerated
)
987 (errcode(ERRCODE_INVALID_COLUMN_REFERENCE
),
988 errmsg("column \"%s\" is a generated column",
990 errdetail("Generated columns cannot be used in COPY.")));
991 attnum
= att
->attnum
;
995 if (attnum
== InvalidAttrNumber
)
999 (errcode(ERRCODE_UNDEFINED_COLUMN
),
1000 errmsg("column \"%s\" of relation \"%s\" does not exist",
1001 name
, RelationGetRelationName(rel
))));
1004 (errcode(ERRCODE_UNDEFINED_COLUMN
),
1005 errmsg("column \"%s\" does not exist",
1008 /* Check for duplicates */
1009 if (list_member_int(attnums
, attnum
))
1011 (errcode(ERRCODE_DUPLICATE_COLUMN
),
1012 errmsg("column \"%s\" specified more than once",
1014 attnums
= lappend_int(attnums
, attnum
);