PostgreSQL Source Code git master
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-2025, 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 "optimizer/optimizer.h"
32#include "parser/parse_coerce.h"
34#include "parser/parse_expr.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"
41
42/*
43 * DoCopy executes the SQL COPY statement
44 *
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
48 * or DELETE query.
49 *
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.
54 *
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.
57 *
58 * Do not allow the copy if user doesn't have proper permission to access
59 * the table or the specifically requested columns.
60 */
61void
63 int stmt_location, int stmt_len,
64 uint64 *processed)
65{
66 bool is_from = stmt->is_from;
67 bool pipe = (stmt->filename == NULL);
68 Relation rel;
69 Oid relid;
70 RawStmt *query = NULL;
71 Node *whereClause = NULL;
72
73 /*
74 * Disallow COPY to/from file or program except to users with the
75 * appropriate role.
76 */
77 if (!pipe)
78 {
79 if (stmt->is_program)
80 {
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.")));
89 }
90 else
91 {
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.")));
100
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.")));
109 }
110 }
111
112 if (stmt->relation)
113 {
114 LOCKMODE lockmode = is_from ? RowExclusiveLock : AccessShareLock;
115 ParseNamespaceItem *nsitem;
116 RTEPermissionInfo *perminfo;
117 TupleDesc tupDesc;
118 List *attnums;
119 ListCell *cur;
120
121 Assert(!stmt->query);
122
123 /* Open and lock the relation, using the appropriate lock type. */
124 rel = table_openrv(stmt->relation, lockmode);
125
126 relid = RelationGetRelid(rel);
127
128 nsitem = addRangeTableEntryForRelation(pstate, rel, lockmode,
129 NULL, false, false);
130
131 perminfo = nsitem->p_perminfo;
132 perminfo->requiredPerms = (is_from ? ACL_INSERT : ACL_SELECT);
133
134 if (stmt->whereClause)
135 {
136 /* add nsitem to query namespace */
137 addNSItemToQuery(pstate, nsitem, false, true, true);
138
139 /* Transform the raw expression tree */
140 whereClause = transformExpr(pstate, stmt->whereClause, EXPR_KIND_COPY_WHERE);
141
142 /* Make sure it yields a boolean result. */
143 whereClause = coerce_to_boolean(pstate, whereClause, "WHERE");
144
145 /* we have to fix its collations too */
146 assign_expr_collations(pstate, whereClause);
147
148 whereClause = eval_const_expressions(NULL, whereClause);
149
150 whereClause = (Node *) canonicalize_qual((Expr *) whereClause, false);
151 whereClause = (Node *) make_ands_implicit((Expr *) whereClause);
152 }
153
154 tupDesc = RelationGetDescr(rel);
155 attnums = CopyGetAttnums(tupDesc, rel, stmt->attlist);
156 foreach(cur, attnums)
157 {
158 int attno;
159 Bitmapset **bms;
160
162 bms = is_from ? &perminfo->insertedCols : &perminfo->selectedCols;
163
164 *bms = bms_add_member(*bms, attno);
165 }
166 ExecCheckPermissions(pstate->p_rtable, list_make1(perminfo), true);
167
168 /*
169 * Permission check for row security policies.
170 *
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.
174 *
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.
178 *
179 * If RLS is not enabled for this, then just fall through to the
180 * normal non-filtering relation handling.
181 */
182 if (check_enable_rls(relid, InvalidOid, false) == RLS_ENABLED)
183 {
185 ColumnRef *cr;
186 ResTarget *target;
187 RangeVar *from;
188 List *targetList = NIL;
189
190 if (is_from)
192 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
193 errmsg("COPY FROM not supported with row-level security"),
194 errhint("Use INSERT statements instead.")));
195
196 /*
197 * Build target list
198 *
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
202 * statement.
203 *
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.
207 */
208 if (!stmt->attlist)
209 {
210 cr = makeNode(ColumnRef);
212 cr->location = -1;
213
214 target = makeNode(ResTarget);
215 target->name = NULL;
216 target->indirection = NIL;
217 target->val = (Node *) cr;
218 target->location = -1;
219
220 targetList = list_make1(target);
221 }
222 else
223 {
224 ListCell *lc;
225
226 foreach(lc, stmt->attlist)
227 {
228 /*
229 * Build the ColumnRef for each column. The ColumnRef
230 * 'fields' property is a String node that corresponds to
231 * the column name respectively.
232 */
233 cr = makeNode(ColumnRef);
234 cr->fields = list_make1(lfirst(lc));
235 cr->location = -1;
236
237 /* Build the ResTarget and add the ColumnRef to it. */
238 target = makeNode(ResTarget);
239 target->name = NULL;
240 target->indirection = NIL;
241 target->val = (Node *) cr;
242 target->location = -1;
243
244 /* Add each column to the SELECT statement's target list */
245 targetList = lappend(targetList, target);
246 }
247 }
248
249 /*
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.
254 */
257 -1);
258 from->inh = false; /* apply ONLY */
259
260 /* Build query */
262 select->targetList = targetList;
263 select->fromClause = list_make1(from);
264
265 query = makeNode(RawStmt);
266 query->stmt = (Node *) select;
267 query->stmt_location = stmt_location;
268 query->stmt_len = stmt_len;
269
270 /*
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.
273 *
274 * We'll reopen it later as part of the query-based COPY.
275 */
276 table_close(rel, NoLock);
277 rel = NULL;
278 }
279 }
280 else
281 {
282 Assert(stmt->query);
283
284 query = makeNode(RawStmt);
285 query->stmt = stmt->query;
286 query->stmt_location = stmt_location;
287 query->stmt_len = stmt_len;
288
289 relid = InvalidOid;
290 rel = NULL;
291 }
292
293 if (is_from)
294 {
295 CopyFromState cstate;
296
297 Assert(rel);
298
299 /* check read-only transaction and parallel mode */
300 if (XactReadOnly && !rel->rd_islocaltemp)
301 PreventCommandIfReadOnly("COPY FROM");
302
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 */
307 EndCopyFrom(cstate);
308 }
309 else
310 {
311 CopyToState cstate;
312
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 */
317 EndCopyTo(cstate);
318 }
319
320 if (rel != NULL)
321 table_close(rel, NoLock);
322}
323
324/*
325 * Extract a CopyHeaderChoice value from a DefElem. This is like
326 * defGetBoolean() but also accepts the special value "match".
327 */
328static CopyHeaderChoice
330{
331 /*
332 * If no parameter value given, assume "true" is meant.
333 */
334 if (def->arg == NULL)
335 return COPY_HEADER_TRUE;
336
337 /*
338 * Allow 0, 1, "true", "false", "on", "off", or "match".
339 */
340 switch (nodeTag(def->arg))
341 {
342 case T_Integer:
343 switch (intVal(def->arg))
344 {
345 case 0:
346 return COPY_HEADER_FALSE;
347 case 1:
348 return COPY_HEADER_TRUE;
349 default:
350 /* otherwise, error out below */
351 break;
352 }
353 break;
354 default:
355 {
356 char *sval = defGetString(def);
357
358 /*
359 * The set of strings accepted here should match up with the
360 * grammar's opt_boolean_or_string production.
361 */
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)
371 {
372 if (!is_from)
374 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
375 errmsg("cannot use \"%s\" with HEADER in COPY TO",
376 sval)));
377 return COPY_HEADER_MATCH;
378 }
379 }
380 break;
381 }
383 (errcode(ERRCODE_SYNTAX_ERROR),
384 errmsg("%s requires a Boolean value or \"match\"",
385 def->defname)));
386 return COPY_HEADER_FALSE; /* keep compiler quiet */
387}
388
389/*
390 * Extract a CopyOnErrorChoice value from a DefElem.
391 */
393defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
394{
395 char *sval = defGetString(def);
396
397 if (!is_from)
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)));
404
405 /*
406 * Allow "stop", or "ignore" values.
407 */
408 if (pg_strcasecmp(sval, "stop") == 0)
409 return COPY_ON_ERROR_STOP;
410 if (pg_strcasecmp(sval, "ignore") == 0)
412
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 */
419}
420
421/*
422 * Extract REJECT_LIMIT value from a DefElem.
423 *
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.
427 */
428static int64
430{
431 int64 reject_limit;
432
433 if (def->arg == NULL)
435 (errcode(ERRCODE_SYNTAX_ERROR),
436 errmsg("%s requires a numeric value",
437 def->defname)));
438 else if (nodeTag(def->arg) == T_String)
439 reject_limit = pg_strtoint64(strVal(def->arg));
440 else
441 reject_limit = defGetInt64(def);
442
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)));
448
449 return reject_limit;
450}
451
452/*
453 * Extract a CopyLogVerbosityChoice value from a DefElem.
454 */
457{
458 char *sval;
459
460 /*
461 * Allow "silent", "default", or "verbose" values.
462 */
463 sval = defGetString(def);
464 if (pg_strcasecmp(sval, "silent") == 0)
466 if (pg_strcasecmp(sval, "default") == 0)
468 if (pg_strcasecmp(sval, "verbose") == 0)
470
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 */
477}
478
479/*
480 * Process the statement option list for COPY.
481 *
482 * Scan the options list (a list of DefElem) and transpose the information
483 * into *opts_out, applying appropriate error checking.
484 *
485 * If 'opts_out' is not NULL, it is assumed to be filled with zeroes initially.
486 *
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.
490 *
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.
494 */
495void
497 CopyFormatOptions *opts_out,
498 bool is_from,
499 List *options)
500{
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;
508
509 /* Support external use for option sanity checking */
510 if (opts_out == NULL)
511 opts_out = (CopyFormatOptions *) palloc0(sizeof(CopyFormatOptions));
512
513 opts_out->file_encoding = -1;
514
515 /* Extract options from the statement node tree */
516 foreach(option, options)
517 {
519
520 if (strcmp(defel->defname, "format") == 0)
521 {
522 char *fmt = defGetString(defel);
523
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;
533 else
535 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
536 errmsg("COPY format \"%s\" not recognized", fmt),
537 parser_errposition(pstate, defel->location)));
538 }
539 else if (strcmp(defel->defname, "freeze") == 0)
540 {
541 if (freeze_specified)
542 errorConflictingDefElem(defel, pstate);
543 freeze_specified = true;
544 opts_out->freeze = defGetBoolean(defel);
545 }
546 else if (strcmp(defel->defname, "delimiter") == 0)
547 {
548 if (opts_out->delim)
549 errorConflictingDefElem(defel, pstate);
550 opts_out->delim = defGetString(defel);
551 }
552 else if (strcmp(defel->defname, "null") == 0)
553 {
554 if (opts_out->null_print)
555 errorConflictingDefElem(defel, pstate);
556 opts_out->null_print = defGetString(defel);
557 }
558 else if (strcmp(defel->defname, "default") == 0)
559 {
560 if (opts_out->default_print)
561 errorConflictingDefElem(defel, pstate);
562 opts_out->default_print = defGetString(defel);
563 }
564 else if (strcmp(defel->defname, "header") == 0)
565 {
566 if (header_specified)
567 errorConflictingDefElem(defel, pstate);
568 header_specified = true;
569 opts_out->header_line = defGetCopyHeaderChoice(defel, is_from);
570 }
571 else if (strcmp(defel->defname, "quote") == 0)
572 {
573 if (opts_out->quote)
574 errorConflictingDefElem(defel, pstate);
575 opts_out->quote = defGetString(defel);
576 }
577 else if (strcmp(defel->defname, "escape") == 0)
578 {
579 if (opts_out->escape)
580 errorConflictingDefElem(defel, pstate);
581 opts_out->escape = defGetString(defel);
582 }
583 else if (strcmp(defel->defname, "force_quote") == 0)
584 {
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);
591 else
593 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
594 errmsg("argument to option \"%s\" must be a list of column names",
595 defel->defname),
596 parser_errposition(pstate, defel->location)));
597 }
598 else if (strcmp(defel->defname, "force_not_null") == 0)
599 {
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);
606 else
608 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
609 errmsg("argument to option \"%s\" must be a list of column names",
610 defel->defname),
611 parser_errposition(pstate, defel->location)));
612 }
613 else if (strcmp(defel->defname, "force_null") == 0)
614 {
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);
621 else
623 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
624 errmsg("argument to option \"%s\" must be a list of column names",
625 defel->defname),
626 parser_errposition(pstate, defel->location)));
627 }
628 else if (strcmp(defel->defname, "convert_selectively") == 0)
629 {
630 /*
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.
634 */
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);
640 else
642 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
643 errmsg("argument to option \"%s\" must be a list of column names",
644 defel->defname),
645 parser_errposition(pstate, defel->location)));
646 }
647 else if (strcmp(defel->defname, "encoding") == 0)
648 {
649 if (opts_out->file_encoding >= 0)
650 errorConflictingDefElem(defel, pstate);
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",
656 defel->defname),
657 parser_errposition(pstate, defel->location)));
658 }
659 else if (strcmp(defel->defname, "on_error") == 0)
660 {
661 if (on_error_specified)
662 errorConflictingDefElem(defel, pstate);
663 on_error_specified = true;
664 opts_out->on_error = defGetCopyOnErrorChoice(defel, pstate, is_from);
665 }
666 else if (strcmp(defel->defname, "log_verbosity") == 0)
667 {
668 if (log_verbosity_specified)
669 errorConflictingDefElem(defel, pstate);
670 log_verbosity_specified = true;
671 opts_out->log_verbosity = defGetCopyLogVerbosityChoice(defel, pstate);
672 }
673 else if (strcmp(defel->defname, "reject_limit") == 0)
674 {
675 if (reject_limit_specified)
676 errorConflictingDefElem(defel, pstate);
677 reject_limit_specified = true;
678 opts_out->reject_limit = defGetCopyRejectLimitOption(defel);
679 }
680 else
682 (errcode(ERRCODE_SYNTAX_ERROR),
683 errmsg("option \"%s\" not recognized",
684 defel->defname),
685 parser_errposition(pstate, defel->location)));
686 }
687
688 /*
689 * Check for incompatible options (must do these three before inserting
690 * defaults)
691 */
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")));
697
698 if (opts_out->binary && opts_out->null_print)
700 (errcode(ERRCODE_SYNTAX_ERROR),
701 errmsg("cannot specify %s in BINARY mode", "NULL")));
702
703 if (opts_out->binary && opts_out->default_print)
705 (errcode(ERRCODE_SYNTAX_ERROR),
706 errmsg("cannot specify %s in BINARY mode", "DEFAULT")));
707
708 /* Set defaults for omitted options */
709 if (!opts_out->delim)
710 opts_out->delim = opts_out->csv_mode ? "," : "\t";
711
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);
715
716 if (opts_out->csv_mode)
717 {
718 if (!opts_out->quote)
719 opts_out->quote = "\"";
720 if (!opts_out->escape)
721 opts_out->escape = opts_out->quote;
722 }
723
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")));
729
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")));
736
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")));
742
743 if (opts_out->default_print)
744 {
745 opts_out->default_print_len = strlen(opts_out->default_print);
746
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")));
752 }
753
754 /*
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.
763 */
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)));
770
771 /* Check header */
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")));
777
778 /* Check quote */
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")));
784
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")));
789
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")));
794
795 /* Check escape */
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")));
801
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")));
806
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",
819 "COPY FROM")));
820
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) &&
829 !is_from)
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",
835 "COPY TO")));
836
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")));
844
845 if ((opts_out->force_null != NIL || opts_out->force_null_all) &&
846 !is_from)
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",
852 "COPY TO")));
853
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",
860 "NULL")));
861
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",
869 "NULL")));
870
871 /* Check freeze */
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",
878 "COPY TO")));
879
880 if (opts_out->default_print)
881 {
882 if (!is_from)
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",
888 "COPY TO")));
889
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",
896 "DEFAULT")));
897
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",
905 "DEFAULT")));
906
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")));
914 }
915 /* Check on_error */
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")));
920
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")));
928}
929
930/*
931 * CopyGetAttnums - build an integer list of attnums to be copied
932 *
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
935 * columns).
936 *
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.
941 *
942 * rel can be NULL ... it's only used for error reports.
943 */
944List *
945CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
946{
947 List *attnums = NIL;
948
949 if (attnamelist == NIL)
950 {
951 /* Generate default column list */
952 int attr_count = tupDesc->natts;
953 int i;
954
955 for (i = 0; i < attr_count; i++)
956 {
957 CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
958
959 if (attr->attisdropped || attr->attgenerated)
960 continue;
961 attnums = lappend_int(attnums, i + 1);
962 }
963 }
964 else
965 {
966 /* Validate the user-supplied list and extract attnums */
967 ListCell *l;
968
969 foreach(l, attnamelist)
970 {
971 char *name = strVal(lfirst(l));
972 int attnum;
973 int i;
974
975 /* Lookup column name */
977 for (i = 0; i < tupDesc->natts; i++)
978 {
979 Form_pg_attribute att = TupleDescAttr(tupDesc, i);
980
981 if (att->attisdropped)
982 continue;
983 if (namestrcmp(&(att->attname), name) == 0)
984 {
985 if (att->attgenerated)
987 (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
988 errmsg("column \"%s\" is a generated column",
989 name),
990 errdetail("Generated columns cannot be used in COPY.")));
991 attnum = att->attnum;
992 break;
993 }
994 }
996 {
997 if (rel != NULL)
999 (errcode(ERRCODE_UNDEFINED_COLUMN),
1000 errmsg("column \"%s\" of relation \"%s\" does not exist",
1002 else
1003 ereport(ERROR,
1004 (errcode(ERRCODE_UNDEFINED_COLUMN),
1005 errmsg("column \"%s\" does not exist",
1006 name)));
1007 }
1008 /* Check for duplicates */
1009 if (list_member_int(attnums, attnum))
1010 ereport(ERROR,
1011 (errcode(ERRCODE_DUPLICATE_COLUMN),
1012 errmsg("column \"%s\" specified more than once",
1013 name)));
1014 attnums = lappend_int(attnums, attnum);
1015 }
1016 }
1017
1018 return attnums;
1019}
bool has_privs_of_role(Oid member, Oid role)
Definition: acl.c:5268
#define InvalidAttrNumber
Definition: attnum.h:23
static CopyHeaderChoice defGetCopyHeaderChoice(DefElem *def, bool is_from)
Definition: copy.c:329
void DoCopy(ParseState *pstate, const CopyStmt *stmt, int stmt_location, int stmt_len, uint64 *processed)
Definition: copy.c:62
static int64 defGetCopyRejectLimitOption(DefElem *def)
Definition: copy.c:429
List * CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
Definition: copy.c:945
static CopyOnErrorChoice defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
Definition: copy.c:393
void ProcessCopyOptions(ParseState *pstate, CopyFormatOptions *opts_out, bool is_from, List *options)
Definition: copy.c:496
static CopyLogVerbosityChoice defGetCopyLogVerbosityChoice(DefElem *def, ParseState *pstate)
Definition: copy.c:456
Bitmapset * bms_add_member(Bitmapset *a, int x)
Definition: bitmapset.c:815
int64_t int64
Definition: c.h:499
uint64_t uint64
Definition: c.h:503
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Definition: clauses.c:2254
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:1529
uint64 CopyFrom(CopyFromState cstate)
Definition: copyfrom.c:779
void EndCopyFrom(CopyFromState cstate)
Definition: copyfrom.c:1914
uint64 DoCopyTo(CopyToState cstate)
Definition: copyto.c:1024
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:623
void EndCopyTo(CopyToState cstate)
Definition: copyto.c:1003
char * defGetString(DefElem *def)
Definition: define.c:35
bool defGetBoolean(DefElem *def)
Definition: define.c:94
int64 defGetInt64(DefElem *def)
Definition: define.c:173
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
Definition: define.c:371
struct cursor * cur
Definition: ecpg.c:29
int errdetail(const char *fmt,...)
Definition: elog.c:1203
int errhint(const char *fmt,...)
Definition: elog.c:1317
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation)
Definition: execMain.c:658
Assert(PointerIsAligned(start, uint64))
CopyOnErrorChoice
Definition: copy.h:38
@ COPY_ON_ERROR_IGNORE
Definition: copy.h:40
@ COPY_ON_ERROR_STOP
Definition: copy.h:39
CopyLogVerbosityChoice
Definition: copy.h:47
@ COPY_LOG_VERBOSITY_SILENT
Definition: copy.h:48
@ COPY_LOG_VERBOSITY_VERBOSE
Definition: copy.h:51
@ COPY_LOG_VERBOSITY_DEFAULT
Definition: copy.h:49
CopyHeaderChoice
Definition: copy.h:27
@ COPY_HEADER_TRUE
Definition: copy.h:29
@ COPY_HEADER_FALSE
Definition: copy.h:28
@ COPY_HEADER_MATCH
Definition: copy.h:30
#define stmt
Definition: indent_codes.h:59
int i
Definition: isn.c:74
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_namespace_name(Oid nspid)
Definition: lsyscache.c:3449
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:1699
void * palloc0(Size size)
Definition: mcxt.c:1347
Oid GetUserId(void)
Definition: miscinit.c:520
int namestrcmp(Name name, const char *str)
Definition: name.c:247
#define IsA(nodeptr, _type_)
Definition: nodes.h:160
#define nodeTag(nodeptr)
Definition: nodes.h:135
#define makeNode(_type_)
Definition: nodes.h:157
#define castNode(_type_, nodeptr)
Definition: nodes.h:178
int64 pg_strtoint64(const char *s)
Definition: numutils.c:644
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:118
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:106
@ EXPR_KIND_COPY_WHERE
Definition: parse_node.h:82
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, int lockmode, Alias *alias, bool inh, bool inFromCl)
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
#define ACL_INSERT
Definition: parsenodes.h:76
#define ACL_SELECT
Definition: parsenodes.h:77
int16 attnum
Definition: pg_attribute.h:74
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:200
#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)
Definition: pgstrcasecmp.c:36
#define InvalidOid
Definition: postgres_ext.h:37
unsigned int Oid
Definition: postgres_ext.h:32
Expr * canonicalize_qual(Expr *qual, bool is_check)
Definition: prepqual.c:293
#define RelationGetRelid(relation)
Definition: rel.h:513
#define RelationGetDescr(relation)
Definition: rel.h:539
#define RelationGetRelationName(relation)
Definition: rel.h:547
#define RelationGetNamespace(relation)
Definition: rel.h:554
int check_enable_rls(Oid relid, Oid checkAsUser, bool noError)
Definition: rls.c:52
@ RLS_ENABLED
Definition: rls.h:45
ParseLoc location
Definition: parsenodes.h:306
List * fields
Definition: parsenodes.h:305
bool attgenerated
Definition: tupdesc.h:78
bool attisdropped
Definition: tupdesc.h:77
int default_print_len
Definition: copy.h:72
bool force_notnull_all
Definition: copy.h:80
bool force_quote_all
Definition: copy.h:77
bool freeze
Definition: copy.h:65
bool binary
Definition: copy.h:64
int null_print_len
Definition: copy.h:69
bool convert_selectively
Definition: copy.h:85
CopyLogVerbosityChoice log_verbosity
Definition: copy.h:87
char * quote
Definition: copy.h:74
CopyOnErrorChoice on_error
Definition: copy.h:86
CopyHeaderChoice header_line
Definition: copy.h:67
List * force_quote
Definition: copy.h:76
char * escape
Definition: copy.h:75
char * null_print
Definition: copy.h:68
List * force_null
Definition: copy.h:82
char * delim
Definition: copy.h:73
int64 reject_limit
Definition: copy.h:88
List * convert_select
Definition: copy.h:89
bool force_null_all
Definition: copy.h:83
bool csv_mode
Definition: copy.h:66
int file_encoding
Definition: copy.h:62
char * default_print
Definition: copy.h:71
List * force_notnull
Definition: copy.h:79
char * defname
Definition: parsenodes.h:826
ParseLoc location
Definition: parsenodes.h:830
Node * arg
Definition: parsenodes.h:827
Definition: pg_list.h:54
Definition: nodes.h:131
RTEPermissionInfo * p_perminfo
Definition: parse_node.h:313
List * p_rtable
Definition: parse_node.h:212
Bitmapset * selectedCols
Definition: parsenodes.h:1302
AclMode requiredPerms
Definition: parsenodes.h:1300
Bitmapset * insertedCols
Definition: parsenodes.h:1303
bool inh
Definition: primnodes.h:86
ParseLoc stmt_location
Definition: parsenodes.h:2067
ParseLoc stmt_len
Definition: parsenodes.h:2068
Node * stmt
Definition: parsenodes.h:2066
bool rd_islocaltemp
Definition: rel.h:61
Node * val
Definition: parsenodes.h:530
ParseLoc location
Definition: parsenodes.h:531
List * indirection
Definition: parsenodes.h:529
char * name
Definition: parsenodes.h:528
#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:154
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:169
void PreventCommandIfReadOnly(const char *cmdname)
Definition: utility.c:404
#define intVal(v)
Definition: value.h:79
#define strVal(v)
Definition: value.h:82
const char * name
#define select(n, r, w, e, timeout)
Definition: win32_port.h:503
bool XactReadOnly
Definition: xact.c:82