PostgreSQL Source Code git master
Loading...
Searching...
No Matches
copy.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * copy.c
4 * Implements the COPY utility command
5 *
6 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/commands/copy.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres.h"
16
17#include <ctype.h>
18#include <unistd.h>
19#include <sys/stat.h>
20
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 "nodes/miscnodes.h"
32#include "optimizer/optimizer.h"
33#include "parser/parse_coerce.h"
35#include "parser/parse_expr.h"
37#include "utils/acl.h"
38#include "utils/builtins.h"
39#include "utils/lsyscache.h"
40#include "utils/rel.h"
41#include "utils/rls.h"
42
43/*
44 * DoCopy executes the SQL COPY statement
45 *
46 * Either unload or reload contents of table <relation>, depending on <from>.
47 * (<from> = true means we are inserting into the table.) In the "TO" case
48 * we also support copying the output of an arbitrary SELECT, INSERT, UPDATE
49 * or DELETE query.
50 *
51 * If <pipe> is false, transfer is between the table and the file named
52 * <filename>. Otherwise, transfer is between the table and our regular
53 * input/output stream. The latter could be either stdin/stdout or a
54 * socket, depending on whether we're running under Postmaster control.
55 *
56 * Do not allow a Postgres user without the 'pg_read_server_files' or
57 * 'pg_write_server_files' role to read from or write to a file.
58 *
59 * Do not allow the copy if user doesn't have proper permission to access
60 * the table or the specifically requested columns.
61 */
62void
64 int stmt_location, int stmt_len,
65 uint64 *processed)
66{
67 bool is_from = stmt->is_from;
68 bool pipe = (stmt->filename == NULL);
69 Relation rel;
70 Oid relid;
71 RawStmt *query = NULL;
72 Node *whereClause = NULL;
73
74 /*
75 * Disallow COPY to/from file or program except to users with the
76 * appropriate role.
77 */
78 if (!pipe)
79 {
80 if (stmt->is_program)
81 {
85 errmsg("permission denied to COPY to or from an external program"),
86 errdetail("Only roles with privileges of the \"%s\" role may COPY to or from an external program.",
87 "pg_execute_server_program"),
88 errhint("Anyone can COPY to stdout or from stdin. "
89 "psql's \\copy command also works for anyone.")));
90 }
91 else
92 {
96 errmsg("permission denied to COPY from a file"),
97 errdetail("Only roles with privileges of the \"%s\" role may COPY from a file.",
98 "pg_read_server_files"),
99 errhint("Anyone can COPY to stdout or from stdin. "
100 "psql's \\copy command also works for anyone.")));
101
105 errmsg("permission denied to COPY to a file"),
106 errdetail("Only roles with privileges of the \"%s\" role may COPY to a file.",
107 "pg_write_server_files"),
108 errhint("Anyone can COPY to stdout or from stdin. "
109 "psql's \\copy command also works for anyone.")));
110 }
111 }
112
113 if (stmt->relation)
114 {
115 LOCKMODE lockmode = is_from ? RowExclusiveLock : AccessShareLock;
118 TupleDesc tupDesc;
119 List *attnums;
120 ListCell *cur;
121
122 Assert(!stmt->query);
123
124 /* Open and lock the relation, using the appropriate lock type. */
125 rel = table_openrv(stmt->relation, lockmode);
126
127 relid = RelationGetRelid(rel);
128
129 nsitem = addRangeTableEntryForRelation(pstate, rel, lockmode,
130 NULL, false, false);
131
132 perminfo = nsitem->p_perminfo;
133 perminfo->requiredPerms = (is_from ? ACL_INSERT : ACL_SELECT);
134
135 if (stmt->whereClause)
136 {
138 int i;
139
140 /* add nsitem to query namespace */
141 addNSItemToQuery(pstate, nsitem, false, true, true);
142
143 /* Transform the raw expression tree */
144 whereClause = transformExpr(pstate, stmt->whereClause, EXPR_KIND_COPY_WHERE);
145
146 /* Make sure it yields a boolean result. */
147 whereClause = coerce_to_boolean(pstate, whereClause, "WHERE");
148
149 /* we have to fix its collations too */
150 assign_expr_collations(pstate, whereClause);
151
152 /*
153 * Examine all the columns in the WHERE clause expression. When
154 * the whole-row reference is present, examine all the columns of
155 * the table.
156 */
157 pull_varattnos(whereClause, 1, &expr_attrs);
159 {
164 }
165
166 i = -1;
167 while ((i = bms_next_member(expr_attrs, i)) >= 0)
168 {
170
171 Assert(attno != 0);
172
173 /*
174 * Prohibit generated columns in the WHERE clause. Stored
175 * generated columns are not yet computed when the filtering
176 * happens. Virtual generated columns could probably work (we
177 * would need to expand them somewhere around here), but for
178 * now we keep them consistent with the stored variant.
179 */
180 if (TupleDescAttr(RelationGetDescr(rel), attno - 1)->attgenerated)
183 errmsg("generated columns are not supported in COPY FROM WHERE conditions"),
184 errdetail("Column \"%s\" is a generated column.",
185 get_attname(RelationGetRelid(rel), attno, false)));
186 }
187
188 whereClause = eval_const_expressions(NULL, whereClause);
189
190 whereClause = (Node *) canonicalize_qual((Expr *) whereClause, false);
191 whereClause = (Node *) make_ands_implicit((Expr *) whereClause);
192 }
193
194 tupDesc = RelationGetDescr(rel);
195 attnums = CopyGetAttnums(tupDesc, rel, stmt->attlist);
196 foreach(cur, attnums)
197 {
198 int attno;
199 Bitmapset **bms;
200
202 bms = is_from ? &perminfo->insertedCols : &perminfo->selectedCols;
203
204 *bms = bms_add_member(*bms, attno);
205 }
207
208 /*
209 * Permission check for row security policies.
210 *
211 * check_enable_rls will ereport(ERROR) if the user has requested
212 * something invalid and will otherwise indicate if we should enable
213 * RLS (returns RLS_ENABLED) or not for this COPY statement.
214 *
215 * If the relation has a row security policy and we are to apply it
216 * then perform a "query" copy and allow the normal query processing
217 * to handle the policies.
218 *
219 * If RLS is not enabled for this, then just fall through to the
220 * normal non-filtering relation handling.
221 */
222 if (check_enable_rls(relid, InvalidOid, false) == RLS_ENABLED)
223 {
225 ColumnRef *cr;
226 ResTarget *target;
227 RangeVar *from;
228 List *targetList = NIL;
229
230 if (is_from)
233 errmsg("COPY FROM not supported with row-level security"),
234 errhint("Use INSERT statements instead.")));
235
236 /*
237 * Build target list
238 *
239 * If no columns are specified in the attribute list of the COPY
240 * command, then the target list is 'all' columns. Therefore, '*'
241 * should be used as the target list for the resulting SELECT
242 * statement.
243 *
244 * In the case that columns are specified in the attribute list,
245 * create a ColumnRef and ResTarget for each column and add them
246 * to the target list for the resulting SELECT statement.
247 */
248 if (!stmt->attlist)
249 {
251 cr->fields = list_make1(makeNode(A_Star));
252 cr->location = -1;
253
254 target = makeNode(ResTarget);
255 target->name = NULL;
256 target->indirection = NIL;
257 target->val = (Node *) cr;
258 target->location = -1;
259
260 targetList = list_make1(target);
261 }
262 else
263 {
264 ListCell *lc;
265
266 foreach(lc, stmt->attlist)
267 {
268 /*
269 * Build the ColumnRef for each column. The ColumnRef
270 * 'fields' property is a String node that corresponds to
271 * the column name respectively.
272 */
274 cr->fields = list_make1(lfirst(lc));
275 cr->location = -1;
276
277 /* Build the ResTarget and add the ColumnRef to it. */
278 target = makeNode(ResTarget);
279 target->name = NULL;
280 target->indirection = NIL;
281 target->val = (Node *) cr;
282 target->location = -1;
283
284 /* Add each column to the SELECT statement's target list */
285 targetList = lappend(targetList, target);
286 }
287 }
288
289 /*
290 * Build RangeVar for from clause, fully qualified based on the
291 * relation which we have opened and locked. Use "ONLY" so that
292 * COPY retrieves rows from only the target table not any
293 * inheritance children, the same as when RLS doesn't apply.
294 *
295 * However, when copying data from a partitioned table, we don't
296 * use "ONLY", since we need to retrieve rows from its descendant
297 * tables too.
298 */
301 -1);
302 from->inh = (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
303
304 /* Build query */
306 select->targetList = targetList;
307 select->fromClause = list_make1(from);
308
309 query = makeNode(RawStmt);
310 query->stmt = (Node *) select;
311 query->stmt_location = stmt_location;
312 query->stmt_len = stmt_len;
313
314 /*
315 * Close the relation for now, but keep the lock on it to prevent
316 * changes between now and when we start the query-based COPY.
317 *
318 * We'll reopen it later as part of the query-based COPY.
319 */
320 table_close(rel, NoLock);
321 rel = NULL;
322 }
323 }
324 else
325 {
326 Assert(stmt->query);
327
328 query = makeNode(RawStmt);
329 query->stmt = stmt->query;
330 query->stmt_location = stmt_location;
331 query->stmt_len = stmt_len;
332
333 relid = InvalidOid;
334 rel = NULL;
335 }
336
337 if (is_from)
338 {
339 CopyFromState cstate;
340
341 Assert(rel);
342
343 /* check read-only transaction and parallel mode */
344 if (XactReadOnly && !rel->rd_islocaltemp)
345 PreventCommandIfReadOnly("COPY FROM");
346
347 cstate = BeginCopyFrom(pstate, rel, whereClause,
348 stmt->filename, stmt->is_program,
349 NULL, stmt->attlist, stmt->options);
350 *processed = CopyFrom(cstate); /* copy from file to database */
351 EndCopyFrom(cstate);
352 }
353 else
354 {
355 CopyToState cstate;
356
357 cstate = BeginCopyTo(pstate, rel, query, relid,
358 stmt->filename, stmt->is_program,
359 NULL, stmt->attlist, stmt->options);
360 *processed = DoCopyTo(cstate); /* copy from database to file */
361 EndCopyTo(cstate);
362 }
363
364 if (rel != NULL)
365 table_close(rel, NoLock);
366}
367
368/*
369 * Extract the CopyFormatOptions.header_line value from a DefElem.
370 *
371 * Parses the HEADER option for COPY, which can be a boolean, an integer greater
372 * than or equal to zero (number of lines to skip), or the special value
373 * "match".
374 */
375static int
377{
378 int ival = COPY_HEADER_FALSE;
379
380 /*
381 * If no parameter value given, assume "true" is meant.
382 */
383 if (def->arg == NULL)
384 return COPY_HEADER_TRUE;
385
386 /*
387 * Allow an integer value greater than or equal to zero (integers
388 * specified as strings are also accepted, mainly for file_fdw foreign
389 * table options), "true", "false", "on", "off", or "match".
390 */
391 switch (nodeTag(def->arg))
392 {
393 case T_Integer:
394 ival = intVal(def->arg);
395 break;
396 default:
397 {
398 char *sval = defGetString(def);
399
400 /*
401 * The set of strings accepted here should match up with the
402 * grammar's opt_boolean_or_string production.
403 */
404 if (pg_strcasecmp(sval, "true") == 0)
405 return COPY_HEADER_TRUE;
406 if (pg_strcasecmp(sval, "false") == 0)
407 return COPY_HEADER_FALSE;
408 if (pg_strcasecmp(sval, "on") == 0)
409 return COPY_HEADER_TRUE;
410 if (pg_strcasecmp(sval, "off") == 0)
411 return COPY_HEADER_FALSE;
412 if (pg_strcasecmp(sval, "match") == 0)
413 {
414 if (!is_from)
417 errmsg("cannot use \"%s\" with HEADER in COPY TO",
418 sval)));
419 return COPY_HEADER_MATCH;
420 }
421 else
422 {
424
425 /* Check if the header is a valid integer */
426 ival = pg_strtoint32_safe(sval, (Node *) &escontext);
427 if (escontext.error_occurred)
430 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
431 second %s is the special value "match" for that option */
432 errmsg("%s requires a Boolean value, an integer "
433 "value greater than or equal to zero, "
434 "or the string \"%s\"",
435 def->defname, "match")));
436 }
437 }
438 break;
439 }
440
441 if (ival < 0)
444 errmsg("a negative integer value cannot be "
445 "specified for %s", def->defname)));
446
447 if (!is_from && ival > 1)
450 errmsg("cannot use multi-line header in COPY TO")));
451
452 return ival;
453}
454
455/*
456 * Extract a CopyOnErrorChoice value from a DefElem.
457 */
459defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
460{
461 char *sval = defGetString(def);
462
463 if (!is_from)
466 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
467 second %s is a COPY with direction, e.g. COPY TO */
468 errmsg("COPY %s cannot be used with %s", "ON_ERROR", "COPY TO"),
469 parser_errposition(pstate, def->location)));
470
471 if (pg_strcasecmp(sval, "stop") == 0)
472 return COPY_ON_ERROR_STOP;
473 if (pg_strcasecmp(sval, "ignore") == 0)
475 if (pg_strcasecmp(sval, "set_null") == 0)
477
480 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */
481 errmsg("COPY %s \"%s\" not recognized", "ON_ERROR", sval),
482 parser_errposition(pstate, def->location)));
483 return COPY_ON_ERROR_STOP; /* keep compiler quiet */
484}
485
486/*
487 * Extract REJECT_LIMIT value from a DefElem.
488 *
489 * REJECT_LIMIT can be specified in two ways: as an int64 for the COPY command
490 * option or as a single-quoted string for the foreign table option using
491 * file_fdw. Therefore this function needs to handle both formats.
492 */
493static int64
495{
496 int64 reject_limit;
497
498 if (def->arg == NULL)
501 errmsg("%s requires a numeric value",
502 def->defname)));
503 else if (IsA(def->arg, String))
504 reject_limit = pg_strtoint64(strVal(def->arg));
505 else
506 reject_limit = defGetInt64(def);
507
508 if (reject_limit <= 0)
511 errmsg("REJECT_LIMIT (%" PRId64 ") must be greater than zero",
512 reject_limit)));
513
514 return reject_limit;
515}
516
517/*
518 * Extract a CopyLogVerbosityChoice value from a DefElem.
519 */
522{
523 char *sval;
524
525 /*
526 * Allow "silent", "default", or "verbose" values.
527 */
528 sval = defGetString(def);
529 if (pg_strcasecmp(sval, "silent") == 0)
531 if (pg_strcasecmp(sval, "default") == 0)
533 if (pg_strcasecmp(sval, "verbose") == 0)
535
538 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */
539 errmsg("COPY %s \"%s\" not recognized", "LOG_VERBOSITY", sval),
540 parser_errposition(pstate, def->location)));
541 return COPY_LOG_VERBOSITY_DEFAULT; /* keep compiler quiet */
542}
543
544/*
545 * Process the statement option list for COPY.
546 *
547 * Scan the options list (a list of DefElem) and transpose the information
548 * into *opts_out, applying appropriate error checking.
549 *
550 * If 'opts_out' is not NULL, it is assumed to be filled with zeroes initially.
551 *
552 * This is exported so that external users of the COPY API can sanity-check
553 * a list of options. In that usage, 'opts_out' can be passed as NULL and
554 * the collected data is just leaked until CurrentMemoryContext is reset.
555 *
556 * Note that additional checking, such as whether column names listed in FORCE
557 * QUOTE actually exist, has to be applied later. This just checks for
558 * self-consistency of the options list.
559 */
560void
563 bool is_from,
564 List *options)
565{
566 bool format_specified = false;
567 bool freeze_specified = false;
568 bool header_specified = false;
569 bool on_error_specified = false;
570 bool log_verbosity_specified = false;
571 bool reject_limit_specified = false;
573
574 /* Support external use for option sanity checking */
575 if (opts_out == NULL)
577
578 opts_out->file_encoding = -1;
579
580 /* Extract options from the statement node tree */
581 foreach(option, options)
582 {
584
585 if (strcmp(defel->defname, "format") == 0)
586 {
587 char *fmt = defGetString(defel);
588
591 format_specified = true;
592 if (strcmp(fmt, "text") == 0)
593 /* default format */ ;
594 else if (strcmp(fmt, "csv") == 0)
595 opts_out->csv_mode = true;
596 else if (strcmp(fmt, "binary") == 0)
597 opts_out->binary = true;
598 else
601 errmsg("COPY format \"%s\" not recognized", fmt),
602 parser_errposition(pstate, defel->location)));
603 }
604 else if (strcmp(defel->defname, "freeze") == 0)
605 {
608 freeze_specified = true;
609 opts_out->freeze = defGetBoolean(defel);
610 }
611 else if (strcmp(defel->defname, "delimiter") == 0)
612 {
613 if (opts_out->delim)
615 opts_out->delim = defGetString(defel);
616 }
617 else if (strcmp(defel->defname, "null") == 0)
618 {
619 if (opts_out->null_print)
621 opts_out->null_print = defGetString(defel);
622 }
623 else if (strcmp(defel->defname, "default") == 0)
624 {
625 if (opts_out->default_print)
627 opts_out->default_print = defGetString(defel);
628 }
629 else if (strcmp(defel->defname, "header") == 0)
630 {
633 header_specified = true;
634 opts_out->header_line = defGetCopyHeaderOption(defel, is_from);
635 }
636 else if (strcmp(defel->defname, "quote") == 0)
637 {
638 if (opts_out->quote)
640 opts_out->quote = defGetString(defel);
641 }
642 else if (strcmp(defel->defname, "escape") == 0)
643 {
644 if (opts_out->escape)
646 opts_out->escape = defGetString(defel);
647 }
648 else if (strcmp(defel->defname, "force_quote") == 0)
649 {
650 if (opts_out->force_quote || opts_out->force_quote_all)
652 if (defel->arg && IsA(defel->arg, A_Star))
653 opts_out->force_quote_all = true;
654 else if (defel->arg && IsA(defel->arg, List))
655 opts_out->force_quote = castNode(List, defel->arg);
656 else
659 errmsg("argument to option \"%s\" must be a list of column names",
660 defel->defname),
661 parser_errposition(pstate, defel->location)));
662 }
663 else if (strcmp(defel->defname, "force_not_null") == 0)
664 {
665 if (opts_out->force_notnull || opts_out->force_notnull_all)
667 if (defel->arg && IsA(defel->arg, A_Star))
668 opts_out->force_notnull_all = true;
669 else if (defel->arg && IsA(defel->arg, List))
670 opts_out->force_notnull = castNode(List, defel->arg);
671 else
674 errmsg("argument to option \"%s\" must be a list of column names",
675 defel->defname),
676 parser_errposition(pstate, defel->location)));
677 }
678 else if (strcmp(defel->defname, "force_null") == 0)
679 {
680 if (opts_out->force_null || opts_out->force_null_all)
682 if (defel->arg && IsA(defel->arg, A_Star))
683 opts_out->force_null_all = true;
684 else if (defel->arg && IsA(defel->arg, List))
685 opts_out->force_null = castNode(List, defel->arg);
686 else
689 errmsg("argument to option \"%s\" must be a list of column names",
690 defel->defname),
691 parser_errposition(pstate, defel->location)));
692 }
693 else if (strcmp(defel->defname, "convert_selectively") == 0)
694 {
695 /*
696 * Undocumented, not-accessible-from-SQL option: convert only the
697 * named columns to binary form, storing the rest as NULLs. It's
698 * allowed for the column list to be NIL.
699 */
700 if (opts_out->convert_selectively)
702 opts_out->convert_selectively = true;
703 if (defel->arg == NULL || IsA(defel->arg, List))
704 opts_out->convert_select = castNode(List, defel->arg);
705 else
708 errmsg("argument to option \"%s\" must be a list of column names",
709 defel->defname),
710 parser_errposition(pstate, defel->location)));
711 }
712 else if (strcmp(defel->defname, "encoding") == 0)
713 {
714 if (opts_out->file_encoding >= 0)
717 if (opts_out->file_encoding < 0)
720 errmsg("argument to option \"%s\" must be a valid encoding name",
721 defel->defname),
722 parser_errposition(pstate, defel->location)));
723 }
724 else if (strcmp(defel->defname, "on_error") == 0)
725 {
728 on_error_specified = true;
729 opts_out->on_error = defGetCopyOnErrorChoice(defel, pstate, is_from);
730 }
731 else if (strcmp(defel->defname, "log_verbosity") == 0)
732 {
736 opts_out->log_verbosity = defGetCopyLogVerbosityChoice(defel, pstate);
737 }
738 else if (strcmp(defel->defname, "reject_limit") == 0)
739 {
744 }
745 else
748 errmsg("option \"%s\" not recognized",
749 defel->defname),
750 parser_errposition(pstate, defel->location)));
751 }
752
753 /*
754 * Check for incompatible options (must do these three before inserting
755 * defaults)
756 */
757 if (opts_out->binary && opts_out->delim)
760 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
761 errmsg("cannot specify %s in BINARY mode", "DELIMITER")));
762
763 if (opts_out->binary && opts_out->null_print)
766 errmsg("cannot specify %s in BINARY mode", "NULL")));
767
768 if (opts_out->binary && opts_out->default_print)
771 errmsg("cannot specify %s in BINARY mode", "DEFAULT")));
772
773 /* Set defaults for omitted options */
774 if (!opts_out->delim)
775 opts_out->delim = opts_out->csv_mode ? "," : "\t";
776
777 if (!opts_out->null_print)
778 opts_out->null_print = opts_out->csv_mode ? "" : "\\N";
779 opts_out->null_print_len = strlen(opts_out->null_print);
780
781 if (opts_out->csv_mode)
782 {
783 if (!opts_out->quote)
784 opts_out->quote = "\"";
785 if (!opts_out->escape)
786 opts_out->escape = opts_out->quote;
787 }
788
789 /* Only single-byte delimiter strings are supported. */
790 if (strlen(opts_out->delim) != 1)
793 errmsg("COPY delimiter must be a single one-byte character")));
794
795 /* Disallow end-of-line characters */
796 if (strchr(opts_out->delim, '\r') != NULL ||
797 strchr(opts_out->delim, '\n') != NULL)
800 errmsg("COPY delimiter cannot be newline or carriage return")));
801
802 if (strchr(opts_out->null_print, '\r') != NULL ||
803 strchr(opts_out->null_print, '\n') != NULL)
806 errmsg("COPY null representation cannot use newline or carriage return")));
807
808 if (opts_out->default_print)
809 {
810 opts_out->default_print_len = strlen(opts_out->default_print);
811
812 if (strchr(opts_out->default_print, '\r') != NULL ||
813 strchr(opts_out->default_print, '\n') != NULL)
816 errmsg("COPY default representation cannot use newline or carriage return")));
817 }
818
819 /*
820 * Disallow unsafe delimiter characters in non-CSV mode. We can't allow
821 * backslash because it would be ambiguous. We can't allow the other
822 * cases because data characters matching the delimiter must be
823 * backslashed, and certain backslash combinations are interpreted
824 * non-literally by COPY IN. Disallowing all lower case ASCII letters is
825 * more than strictly necessary, but seems best for consistency and
826 * future-proofing. Likewise we disallow all digits though only octal
827 * digits are actually dangerous.
828 */
829 if (!opts_out->csv_mode &&
830 strchr("\\.abcdefghijklmnopqrstuvwxyz0123456789",
831 opts_out->delim[0]) != NULL)
834 errmsg("COPY delimiter cannot be \"%s\"", opts_out->delim)));
835
836 /* Check header */
837 if (opts_out->binary && opts_out->header_line != COPY_HEADER_FALSE)
840 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
841 errmsg("cannot specify %s in BINARY mode", "HEADER")));
842
843 /* Check quote */
844 if (!opts_out->csv_mode && opts_out->quote != NULL)
847 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
848 errmsg("COPY %s requires CSV mode", "QUOTE")));
849
850 if (opts_out->csv_mode && strlen(opts_out->quote) != 1)
853 errmsg("COPY quote must be a single one-byte character")));
854
855 if (opts_out->csv_mode && opts_out->delim[0] == opts_out->quote[0])
858 errmsg("COPY delimiter and quote must be different")));
859
860 /* Check escape */
861 if (!opts_out->csv_mode && opts_out->escape != NULL)
864 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
865 errmsg("COPY %s requires CSV mode", "ESCAPE")));
866
867 if (opts_out->csv_mode && strlen(opts_out->escape) != 1)
870 errmsg("COPY escape must be a single one-byte character")));
871
872 /* Check force_quote */
873 if (!opts_out->csv_mode && (opts_out->force_quote || opts_out->force_quote_all))
876 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
877 errmsg("COPY %s requires CSV mode", "FORCE_QUOTE")));
878 if ((opts_out->force_quote || opts_out->force_quote_all) && is_from)
881 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
882 second %s is a COPY with direction, e.g. COPY TO */
883 errmsg("COPY %s cannot be used with %s", "FORCE_QUOTE",
884 "COPY FROM")));
885
886 /* Check force_notnull */
887 if (!opts_out->csv_mode && (opts_out->force_notnull != NIL ||
888 opts_out->force_notnull_all))
891 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
892 errmsg("COPY %s requires CSV mode", "FORCE_NOT_NULL")));
893 if ((opts_out->force_notnull != NIL || opts_out->force_notnull_all) &&
894 !is_from)
897 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
898 second %s is a COPY with direction, e.g. COPY TO */
899 errmsg("COPY %s cannot be used with %s", "FORCE_NOT_NULL",
900 "COPY TO")));
901
902 /* Check force_null */
903 if (!opts_out->csv_mode && (opts_out->force_null != NIL ||
904 opts_out->force_null_all))
907 /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */
908 errmsg("COPY %s requires CSV mode", "FORCE_NULL")));
909
910 if ((opts_out->force_null != NIL || opts_out->force_null_all) &&
911 !is_from)
914 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
915 second %s is a COPY with direction, e.g. COPY TO */
916 errmsg("COPY %s cannot be used with %s", "FORCE_NULL",
917 "COPY TO")));
918
919 /* Don't allow the delimiter to appear in the null string. */
920 if (strchr(opts_out->null_print, opts_out->delim[0]) != NULL)
923 /*- translator: %s is the name of a COPY option, e.g. NULL */
924 errmsg("COPY delimiter character must not appear in the %s specification",
925 "NULL")));
926
927 /* Don't allow the CSV quote char to appear in the null string. */
928 if (opts_out->csv_mode &&
929 strchr(opts_out->null_print, opts_out->quote[0]) != NULL)
932 /*- translator: %s is the name of a COPY option, e.g. NULL */
933 errmsg("CSV quote character must not appear in the %s specification",
934 "NULL")));
935
936 /* Check freeze */
937 if (opts_out->freeze && !is_from)
940 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
941 second %s is a COPY with direction, e.g. COPY TO */
942 errmsg("COPY %s cannot be used with %s", "FREEZE",
943 "COPY TO")));
944
945 if (opts_out->default_print)
946 {
947 if (!is_from)
950 /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR,
951 second %s is a COPY with direction, e.g. COPY TO */
952 errmsg("COPY %s cannot be used with %s", "DEFAULT",
953 "COPY TO")));
954
955 /* Don't allow the delimiter to appear in the default string. */
956 if (strchr(opts_out->default_print, opts_out->delim[0]) != NULL)
959 /*- translator: %s is the name of a COPY option, e.g. NULL */
960 errmsg("COPY delimiter character must not appear in the %s specification",
961 "DEFAULT")));
962
963 /* Don't allow the CSV quote char to appear in the default string. */
964 if (opts_out->csv_mode &&
965 strchr(opts_out->default_print, opts_out->quote[0]) != NULL)
968 /*- translator: %s is the name of a COPY option, e.g. NULL */
969 errmsg("CSV quote character must not appear in the %s specification",
970 "DEFAULT")));
971
972 /* Don't allow the NULL and DEFAULT string to be the same */
973 if (opts_out->null_print_len == opts_out->default_print_len &&
974 strncmp(opts_out->null_print, opts_out->default_print,
975 opts_out->null_print_len) == 0)
978 errmsg("NULL specification and DEFAULT specification cannot be the same")));
979 }
980 /* Check on_error */
981 if (opts_out->binary && opts_out->on_error != COPY_ON_ERROR_STOP)
984 errmsg("only ON_ERROR STOP is allowed in BINARY mode")));
985
986 if (opts_out->reject_limit && opts_out->on_error != COPY_ON_ERROR_IGNORE)
989 /*- translator: first and second %s are the names of COPY option, e.g.
990 * ON_ERROR, third is the value of the COPY option, e.g. IGNORE */
991 errmsg("COPY %s requires %s to be set to %s",
992 "REJECT_LIMIT", "ON_ERROR", "IGNORE")));
993}
994
995/*
996 * CopyGetAttnums - build an integer list of attnums to be copied
997 *
998 * The input attnamelist is either the user-specified column list,
999 * or NIL if there was none (in which case we want all the non-dropped
1000 * columns).
1001 *
1002 * We don't include generated columns in the generated full list and we don't
1003 * allow them to be specified explicitly. They don't make sense for COPY
1004 * FROM, but we could possibly allow them for COPY TO. But this way it's at
1005 * least ensured that whatever we copy out can be copied back in.
1006 *
1007 * rel can be NULL ... it's only used for error reports.
1008 */
1009List *
1011{
1012 List *attnums = NIL;
1013
1014 if (attnamelist == NIL)
1015 {
1016 /* Generate default column list */
1017 int attr_count = tupDesc->natts;
1018 int i;
1019
1020 for (i = 0; i < attr_count; i++)
1021 {
1022 CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
1023
1024 if (attr->attisdropped || attr->attgenerated)
1025 continue;
1026 attnums = lappend_int(attnums, i + 1);
1027 }
1028 }
1029 else
1030 {
1031 /* Validate the user-supplied list and extract attnums */
1032 ListCell *l;
1033
1034 foreach(l, attnamelist)
1035 {
1036 char *name = strVal(lfirst(l));
1037 int attnum;
1038 int i;
1039
1040 /* Lookup column name */
1042 for (i = 0; i < tupDesc->natts; i++)
1043 {
1045
1046 if (att->attisdropped)
1047 continue;
1048 if (namestrcmp(&(att->attname), name) == 0)
1049 {
1050 if (att->attgenerated)
1051 ereport(ERROR,
1053 errmsg("column \"%s\" is a generated column",
1054 name),
1055 errdetail("Generated columns cannot be used in COPY.")));
1056 attnum = att->attnum;
1057 break;
1058 }
1059 }
1061 {
1062 if (rel != NULL)
1063 ereport(ERROR,
1065 errmsg("column \"%s\" of relation \"%s\" does not exist",
1067 else
1068 ereport(ERROR,
1070 errmsg("column \"%s\" does not exist",
1071 name)));
1072 }
1073 /* Check for duplicates */
1074 if (list_member_int(attnums, attnum))
1075 ereport(ERROR,
1077 errmsg("column \"%s\" specified more than once",
1078 name)));
1079 attnums = lappend_int(attnums, attnum);
1080 }
1081 }
1082
1083 return attnums;
1084}
bool has_privs_of_role(Oid member, Oid role)
Definition acl.c:5298
int16 AttrNumber
Definition attnum.h:21
#define InvalidAttrNumber
Definition attnum.h:23
void DoCopy(ParseState *pstate, const CopyStmt *stmt, int stmt_location, int stmt_len, uint64 *processed)
Definition copy.c:63
static int defGetCopyHeaderOption(DefElem *def, bool is_from)
Definition copy.c:376
static int64 defGetCopyRejectLimitOption(DefElem *def)
Definition copy.c:494
List * CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
Definition copy.c:1010
static CopyOnErrorChoice defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
Definition copy.c:459
void ProcessCopyOptions(ParseState *pstate, CopyFormatOptions *opts_out, bool is_from, List *options)
Definition copy.c:561
static CopyLogVerbosityChoice defGetCopyLogVerbosityChoice(DefElem *def, ParseState *pstate)
Definition copy.c:521
int bms_next_member(const Bitmapset *a, int prevbit)
Definition bitmapset.c:1290
Bitmapset * bms_add_range(Bitmapset *a, int lower, int upper)
Definition bitmapset.c:1003
Bitmapset * bms_del_member(Bitmapset *a, int x)
Definition bitmapset.c:852
bool bms_is_member(int x, const Bitmapset *a)
Definition bitmapset.c:510
Bitmapset * bms_add_member(Bitmapset *a, int x)
Definition bitmapset.c:799
#define Assert(condition)
Definition c.h:915
int64_t int64
Definition c.h:585
uint64_t uint64
Definition c.h:589
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Definition clauses.c:2498
CopyFromState BeginCopyFrom(ParseState *pstate, Relation rel, Node *whereClause, const char *filename, bool is_program, copy_data_source_cb data_source_cb, List *attnamelist, List *options)
Definition copyfrom.c:1534
uint64 CopyFrom(CopyFromState cstate)
Definition copyfrom.c:780
void EndCopyFrom(CopyFromState cstate)
Definition copyfrom.c:1940
uint64 DoCopyTo(CopyToState cstate)
Definition copyto.c:1064
CopyToState BeginCopyTo(ParseState *pstate, Relation rel, RawStmt *raw_query, Oid queryRelId, const char *filename, bool is_program, copy_data_dest_cb data_dest_cb, List *attnamelist, List *options)
Definition copyto.c:635
void EndCopyTo(CopyToState cstate)
Definition copyto.c:1043
char * defGetString(DefElem *def)
Definition define.c:34
bool defGetBoolean(DefElem *def)
Definition define.c:93
int64 defGetInt64(DefElem *def)
Definition define.c:172
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
Definition define.c:370
struct cursor * cur
Definition ecpg.c:29
int errcode(int sqlerrcode)
Definition elog.c:874
int errhint(const char *fmt,...) pg_attribute_printf(1
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation)
Definition execMain.c:582
#define palloc0_object(type)
Definition fe_memutils.h:75
CopyOnErrorChoice
Definition copy.h:35
@ COPY_ON_ERROR_IGNORE
Definition copy.h:37
@ COPY_ON_ERROR_SET_NULL
Definition copy.h:38
@ COPY_ON_ERROR_STOP
Definition copy.h:36
CopyLogVerbosityChoice
Definition copy.h:45
@ COPY_LOG_VERBOSITY_SILENT
Definition copy.h:46
@ COPY_LOG_VERBOSITY_VERBOSE
Definition copy.h:49
@ COPY_LOG_VERBOSITY_DEFAULT
Definition copy.h:47
#define COPY_HEADER_MATCH
Definition copy.h:26
#define COPY_HEADER_FALSE
Definition copy.h:27
#define COPY_HEADER_TRUE
Definition copy.h:28
#define stmt
int i
Definition isn.c:77
List * lappend(List *list, void *datum)
Definition list.c:339
List * lappend_int(List *list, int datum)
Definition list.c:357
bool list_member_int(const List *list, int datum)
Definition list.c:702
int LOCKMODE
Definition lockdefs.h:26
#define NoLock
Definition lockdefs.h:34
#define AccessShareLock
Definition lockdefs.h:36
#define RowExclusiveLock
Definition lockdefs.h:38
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
Definition lsyscache.c:944
char * get_namespace_name(Oid nspid)
Definition lsyscache.c:3586
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Definition makefuncs.c:473
List * make_ands_implicit(Expr *clause)
Definition makefuncs.c:810
char * pstrdup(const char *in)
Definition mcxt.c:1781
Oid GetUserId(void)
Definition miscinit.c:470
int namestrcmp(Name name, const char *str)
Definition name.c:247
#define IsA(nodeptr, _type_)
Definition nodes.h:164
#define nodeTag(nodeptr)
Definition nodes.h:139
#define makeNode(_type_)
Definition nodes.h:161
#define castNode(_type_, nodeptr)
Definition nodes.h:182
int64 pg_strtoint64(const char *s)
Definition numutils.c:643
int32 pg_strtoint32_safe(const char *s, Node *escontext)
Definition numutils.c:388
static char * errmsg
Node * coerce_to_boolean(ParseState *pstate, Node *node, const char *constructName)
void assign_expr_collations(ParseState *pstate, Node *expr)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
Definition parse_expr.c:120
int parser_errposition(ParseState *pstate, int location)
Definition parse_node.c:106
@ EXPR_KIND_COPY_WHERE
Definition parse_node.h:82
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, LOCKMODE lockmode, Alias *alias, bool inh, bool inFromCl)
#define ACL_INSERT
Definition parsenodes.h:76
#define ACL_SELECT
Definition parsenodes.h:77
int16 attnum
FormData_pg_attribute * Form_pg_attribute
#define lfirst(lc)
Definition pg_list.h:172
#define lfirst_node(type, lc)
Definition pg_list.h:176
#define NIL
Definition pg_list.h:68
#define lfirst_int(lc)
Definition pg_list.h:173
#define list_make1(x1)
Definition pg_list.h:212
#define pg_char_to_encoding
Definition pg_wchar.h:629
int pg_strcasecmp(const char *s1, const char *s2)
#define InvalidOid
unsigned int Oid
Expr * canonicalize_qual(Expr *qual, bool is_check)
Definition prepqual.c:293
static int fb(int x)
#define RelationGetRelid(relation)
Definition rel.h:514
#define RelationGetDescr(relation)
Definition rel.h:540
#define RelationGetNumberOfAttributes(relation)
Definition rel.h:520
#define RelationGetRelationName(relation)
Definition rel.h:548
#define RelationGetNamespace(relation)
Definition rel.h:555
int check_enable_rls(Oid relid, Oid checkAsUser, bool noError)
Definition rls.c:52
@ RLS_ENABLED
Definition rls.h:45
bool attgenerated
Definition tupdesc.h:78
bool attisdropped
Definition tupdesc.h:77
char * defname
Definition parsenodes.h:844
ParseLoc location
Definition parsenodes.h:848
Node * arg
Definition parsenodes.h:845
Definition pg_list.h:54
Definition nodes.h:135
List * p_rtable
Definition parse_node.h:192
bool inh
Definition primnodes.h:87
ParseLoc stmt_location
ParseLoc stmt_len
Node * stmt
bool rd_islocaltemp
Definition rel.h:61
Form_pg_class rd_rel
Definition rel.h:111
Node * val
Definition parsenodes.h:547
ParseLoc location
Definition parsenodes.h:548
List * indirection
Definition parsenodes.h:546
char * name
Definition parsenodes.h:545
Definition value.h:64
#define FirstLowInvalidHeapAttributeNumber
Definition sysattr.h:27
void table_close(Relation relation, LOCKMODE lockmode)
Definition table.c:126
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition table.c:83
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:160
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:175
void PreventCommandIfReadOnly(const char *cmdname)
Definition utility.c:406
#define intVal(v)
Definition value.h:79
#define strVal(v)
Definition value.h:82
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
Definition var.c:296
const char * name
#define select(n, r, w, e, timeout)
Definition win32_port.h:500
bool XactReadOnly
Definition xact.c:84