PostgreSQL Source Code  git master
copy.c File Reference
#include "postgres.h"
#include <ctype.h>
#include <unistd.h>
#include <sys/stat.h>
#include "access/sysattr.h"
#include "access/table.h"
#include "access/xact.h"
#include "catalog/pg_authid.h"
#include "commands/copy.h"
#include "commands/defrem.h"
#include "executor/executor.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "optimizer/optimizer.h"
#include "parser/parse_coerce.h"
#include "parser/parse_collate.h"
#include "parser/parse_expr.h"
#include "parser/parse_relation.h"
#include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
#include "utils/rel.h"
#include "utils/rls.h"
Include dependency graph for copy.c:

Go to the source code of this file.

Functions

void DoCopy (ParseState *pstate, const CopyStmt *stmt, int stmt_location, int stmt_len, uint64 *processed)
 
static CopyHeaderChoice defGetCopyHeaderChoice (DefElem *def, bool is_from)
 
static CopyOnErrorChoice defGetCopyOnErrorChoice (DefElem *def, ParseState *pstate, bool is_from)
 
static int64 defGetCopyRejectLimitOption (DefElem *def)
 
static CopyLogVerbosityChoice defGetCopyLogVerbosityChoice (DefElem *def, ParseState *pstate)
 
void ProcessCopyOptions (ParseState *pstate, CopyFormatOptions *opts_out, bool is_from, List *options)
 
ListCopyGetAttnums (TupleDesc tupDesc, Relation rel, List *attnamelist)
 

Function Documentation

◆ CopyGetAttnums()

List* CopyGetAttnums ( TupleDesc  tupDesc,
Relation  rel,
List attnamelist 
)

Definition at line 945 of file copy.c.

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  if (TupleDescAttr(tupDesc, i)->attisdropped)
958  continue;
959  if (TupleDescAttr(tupDesc, i)->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)
986  ereport(ERROR,
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  }
995  if (attnum == InvalidAttrNumber)
996  {
997  if (rel != NULL)
998  ereport(ERROR,
999  (errcode(ERRCODE_UNDEFINED_COLUMN),
1000  errmsg("column \"%s\" of relation \"%s\" does not exist",
1001  name, RelationGetRelationName(rel))));
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 }
#define InvalidAttrNumber
Definition: attnum.h:23
int errdetail(const char *fmt,...)
Definition: elog.c:1203
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
int i
Definition: isn.c:72
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 namestrcmp(Name name, const char *str)
Definition: name.c:247
int16 attnum
Definition: pg_attribute.h:74
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:209
#define lfirst(lc)
Definition: pg_list.h:172
#define NIL
Definition: pg_list.h:68
#define RelationGetRelationName(relation)
Definition: rel.h:539
Definition: pg_list.h:54
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:92
#define strVal(v)
Definition: value.h:82
const char * name

References attnum, ereport, errcode(), errdetail(), errmsg(), ERROR, i, InvalidAttrNumber, lappend_int(), lfirst, list_member_int(), name, namestrcmp(), TupleDescData::natts, NIL, RelationGetRelationName, strVal, and TupleDescAttr.

Referenced by BeginCopyFrom(), BeginCopyTo(), and DoCopy().

◆ defGetCopyHeaderChoice()

static CopyHeaderChoice defGetCopyHeaderChoice ( DefElem def,
bool  is_from 
)
static

Definition at line 329 of file copy.c.

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)
373  ereport(ERROR,
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  }
382  ereport(ERROR,
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 }
char * defGetString(DefElem *def)
Definition: define.c:48
@ COPY_HEADER_TRUE
Definition: copy.h:29
@ COPY_HEADER_FALSE
Definition: copy.h:28
@ COPY_HEADER_MATCH
Definition: copy.h:30
#define nodeTag(nodeptr)
Definition: nodes.h:133
int pg_strcasecmp(const char *s1, const char *s2)
Definition: pgstrcasecmp.c:36
char * defname
Definition: parsenodes.h:817
Node * arg
Definition: parsenodes.h:818
#define intVal(v)
Definition: value.h:79

References DefElem::arg, COPY_HEADER_FALSE, COPY_HEADER_MATCH, COPY_HEADER_TRUE, defGetString(), DefElem::defname, ereport, errcode(), errmsg(), ERROR, intVal, nodeTag, and pg_strcasecmp().

Referenced by ProcessCopyOptions().

◆ defGetCopyLogVerbosityChoice()

static CopyLogVerbosityChoice defGetCopyLogVerbosityChoice ( DefElem def,
ParseState pstate 
)
static

Definition at line 456 of file copy.c.

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 
471  ereport(ERROR,
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 }
@ COPY_LOG_VERBOSITY_SILENT
Definition: copy.h:48
@ COPY_LOG_VERBOSITY_VERBOSE
Definition: copy.h:51
@ COPY_LOG_VERBOSITY_DEFAULT
Definition: copy.h:49
int parser_errposition(ParseState *pstate, int location)
Definition: parse_node.c:106
ParseLoc location
Definition: parsenodes.h:821

References COPY_LOG_VERBOSITY_DEFAULT, COPY_LOG_VERBOSITY_SILENT, COPY_LOG_VERBOSITY_VERBOSE, defGetString(), ereport, errcode(), errmsg(), ERROR, DefElem::location, parser_errposition(), and pg_strcasecmp().

Referenced by ProcessCopyOptions().

◆ defGetCopyOnErrorChoice()

static CopyOnErrorChoice defGetCopyOnErrorChoice ( DefElem def,
ParseState pstate,
bool  is_from 
)
static

Definition at line 393 of file copy.c.

394 {
395  char *sval = defGetString(def);
396 
397  if (!is_from)
398  ereport(ERROR,
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)
411  return COPY_ON_ERROR_IGNORE;
412 
413  ereport(ERROR,
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 }
@ COPY_ON_ERROR_IGNORE
Definition: copy.h:40
@ COPY_ON_ERROR_STOP
Definition: copy.h:39

References COPY_ON_ERROR_IGNORE, COPY_ON_ERROR_STOP, defGetString(), ereport, errcode(), errmsg(), ERROR, DefElem::location, parser_errposition(), and pg_strcasecmp().

Referenced by ProcessCopyOptions().

◆ defGetCopyRejectLimitOption()

static int64 defGetCopyRejectLimitOption ( DefElem def)
static

Definition at line 429 of file copy.c.

430 {
431  int64 reject_limit;
432 
433  if (def->arg == NULL)
434  ereport(ERROR,
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)
444  ereport(ERROR,
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 }
int64_t int64
Definition: c.h:482
int64 defGetInt64(DefElem *def)
Definition: define.c:186
int64 pg_strtoint64(const char *s)
Definition: numutils.c:644

References DefElem::arg, defGetInt64(), DefElem::defname, ereport, errcode(), errmsg(), ERROR, nodeTag, pg_strtoint64(), and strVal.

Referenced by ProcessCopyOptions().

◆ DoCopy()

void DoCopy ( ParseState pstate,
const CopyStmt stmt,
int  stmt_location,
int  stmt_len,
uint64 processed 
)

Definition at line 62 of file copy.c.

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))
82  ereport(ERROR,
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))
93  ereport(ERROR,
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))
102  ereport(ERROR,
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)
191  ereport(ERROR,
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 }
bool has_privs_of_role(Oid member, Oid role)
Definition: acl.c:5268
List * CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
Definition: copy.c:945
Bitmapset * bms_add_member(Bitmapset *a, int x)
Definition: bitmapset.c:815
#define Assert(condition)
Definition: c.h:812
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Definition: clauses.c:2253
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:1383
uint64 CopyFrom(CopyFromState cstate)
Definition: copyfrom.c:640
void EndCopyFrom(CopyFromState cstate)
Definition: copyfrom.c:1802
uint64 DoCopyTo(CopyToState cstate)
Definition: copyto.c:747
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:350
void EndCopyTo(CopyToState cstate)
Definition: copyto.c:726
struct cursor * cur
Definition: ecpg.c:29
int errhint(const char *fmt,...)
Definition: elog.c:1317
bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation)
Definition: execMain.c:579
#define stmt
Definition: indent_codes.h:59
List * lappend(List *list, void *datum)
Definition: list.c:339
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:3366
List * make_ands_implicit(Expr *clause)
Definition: makefuncs.c:760
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Definition: makefuncs.c:424
char * pstrdup(const char *in)
Definition: mcxt.c:1696
Oid GetUserId(void)
Definition: miscinit.c:524
#define makeNode(_type_)
Definition: nodes.h:155
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
@ 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
#define lfirst_int(lc)
Definition: pg_list.h:173
#define list_make1(x1)
Definition: pg_list.h:212
#define InvalidOid
Definition: postgres_ext.h:36
unsigned int Oid
Definition: postgres_ext.h:31
Expr * canonicalize_qual(Expr *qual, bool is_check)
Definition: prepqual.c:293
#define RelationGetRelid(relation)
Definition: rel.h:505
#define RelationGetDescr(relation)
Definition: rel.h:531
#define RelationGetNamespace(relation)
Definition: rel.h:546
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:297
List * fields
Definition: parsenodes.h:296
Definition: nodes.h:129
RTEPermissionInfo * p_perminfo
Definition: parse_node.h:308
List * p_rtable
Definition: parse_node.h:212
Bitmapset * selectedCols
Definition: parsenodes.h:1293
AclMode requiredPerms
Definition: parsenodes.h:1291
Bitmapset * insertedCols
Definition: parsenodes.h:1294
bool inh
Definition: primnodes.h:85
ParseLoc stmt_location
Definition: parsenodes.h:2023
ParseLoc stmt_len
Definition: parsenodes.h:2024
Node * stmt
Definition: parsenodes.h:2022
bool rd_islocaltemp
Definition: rel.h:61
Node * val
Definition: parsenodes.h:521
ParseLoc location
Definition: parsenodes.h:522
List * indirection
Definition: parsenodes.h:520
char * name
Definition: parsenodes.h:519
#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
void PreventCommandIfReadOnly(const char *cmdname)
Definition: utility.c:404
#define select(n, r, w, e, timeout)
Definition: win32_port.h:513
bool XactReadOnly
Definition: xact.c:81

References AccessShareLock, ACL_INSERT, ACL_SELECT, addNSItemToQuery(), addRangeTableEntryForRelation(), Assert, assign_expr_collations(), BeginCopyFrom(), BeginCopyTo(), bms_add_member(), canonicalize_qual(), check_enable_rls(), coerce_to_boolean(), CopyFrom(), CopyGetAttnums(), cur, DoCopyTo(), EndCopyFrom(), EndCopyTo(), ereport, errcode(), errdetail(), errhint(), errmsg(), ERROR, eval_const_expressions(), ExecCheckPermissions(), EXPR_KIND_COPY_WHERE, ColumnRef::fields, FirstLowInvalidHeapAttributeNumber, get_namespace_name(), GetUserId(), has_privs_of_role(), ResTarget::indirection, RangeVar::inh, RTEPermissionInfo::insertedCols, InvalidOid, lappend(), lfirst, lfirst_int, list_make1, ColumnRef::location, ResTarget::location, make_ands_implicit(), makeNode, makeRangeVar(), ResTarget::name, NIL, NoLock, ParseNamespaceItem::p_perminfo, ParseState::p_rtable, PreventCommandIfReadOnly(), pstrdup(), RelationData::rd_islocaltemp, RelationGetDescr, RelationGetNamespace, RelationGetRelationName, RelationGetRelid, RTEPermissionInfo::requiredPerms, RLS_ENABLED, RowExclusiveLock, select, RTEPermissionInfo::selectedCols, RawStmt::stmt, stmt, RawStmt::stmt_len, RawStmt::stmt_location, table_close(), table_openrv(), transformExpr(), ResTarget::val, and XactReadOnly.

Referenced by standard_ProcessUtility().

◆ ProcessCopyOptions()

void ProcessCopyOptions ( ParseState pstate,
CopyFormatOptions opts_out,
bool  is_from,
List options 
)

Definition at line 496 of file copy.c.

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;
507  ListCell *option;
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  {
518  DefElem *defel = lfirst_node(DefElem, option);
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
534  ereport(ERROR,
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
592  ereport(ERROR,
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
607  ereport(ERROR,
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
622  ereport(ERROR,
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
641  ereport(ERROR,
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);
651  opts_out->file_encoding = pg_char_to_encoding(defGetString(defel));
652  if (opts_out->file_encoding < 0)
653  ereport(ERROR,
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
681  ereport(ERROR,
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)
693  ereport(ERROR,
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)
699  ereport(ERROR,
700  (errcode(ERRCODE_SYNTAX_ERROR),
701  errmsg("cannot specify %s in BINARY mode", "NULL")));
702 
703  if (opts_out->binary && opts_out->default_print)
704  ereport(ERROR,
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)
726  ereport(ERROR,
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)
733  ereport(ERROR,
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)
739  ereport(ERROR,
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)
749  ereport(ERROR,
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)
767  ereport(ERROR,
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)
773  ereport(ERROR,
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)
780  ereport(ERROR,
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)
786  ereport(ERROR,
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])
791  ereport(ERROR,
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)
797  ereport(ERROR,
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)
803  ereport(ERROR,
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))
809  ereport(ERROR,
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)
814  ereport(ERROR,
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))
824  ereport(ERROR,
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)
830  ereport(ERROR,
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))
840  ereport(ERROR,
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)
847  ereport(ERROR,
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)
856  ereport(ERROR,
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)
865  ereport(ERROR,
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)
873  ereport(ERROR,
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)
883  ereport(ERROR,
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)
892  ereport(ERROR,
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)
901  ereport(ERROR,
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)
911  ereport(ERROR,
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)
917  ereport(ERROR,
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)
922  ereport(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 }
static CopyHeaderChoice defGetCopyHeaderChoice(DefElem *def, bool is_from)
Definition: copy.c:329
static int64 defGetCopyRejectLimitOption(DefElem *def)
Definition: copy.c:429
static CopyOnErrorChoice defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from)
Definition: copy.c:393
static CopyLogVerbosityChoice defGetCopyLogVerbosityChoice(DefElem *def, ParseState *pstate)
Definition: copy.c:456
bool defGetBoolean(DefElem *def)
Definition: define.c:107
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
Definition: define.c:384
static void const char * fmt
void * palloc0(Size size)
Definition: mcxt.c:1347
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
#define castNode(_type_, nodeptr)
Definition: nodes.h:176
#define lfirst_node(type, lc)
Definition: pg_list.h:176
#define pg_char_to_encoding
Definition: pg_wchar.h:629
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

References DefElem::arg, CopyFormatOptions::binary, castNode, CopyFormatOptions::convert_select, CopyFormatOptions::convert_selectively, COPY_ON_ERROR_STOP, CopyFormatOptions::csv_mode, CopyFormatOptions::default_print, CopyFormatOptions::default_print_len, defGetBoolean(), defGetCopyHeaderChoice(), defGetCopyLogVerbosityChoice(), defGetCopyOnErrorChoice(), defGetCopyRejectLimitOption(), defGetString(), DefElem::defname, CopyFormatOptions::delim, ereport, errcode(), errmsg(), ERROR, errorConflictingDefElem(), CopyFormatOptions::escape, CopyFormatOptions::file_encoding, fmt, CopyFormatOptions::force_notnull, CopyFormatOptions::force_notnull_all, CopyFormatOptions::force_null, CopyFormatOptions::force_null_all, CopyFormatOptions::force_quote, CopyFormatOptions::force_quote_all, CopyFormatOptions::freeze, CopyFormatOptions::header_line, IsA, lfirst_node, DefElem::location, CopyFormatOptions::log_verbosity, NIL, CopyFormatOptions::null_print, CopyFormatOptions::null_print_len, CopyFormatOptions::on_error, palloc0(), parser_errposition(), pg_char_to_encoding, CopyFormatOptions::quote, and CopyFormatOptions::reject_limit.

Referenced by BeginCopyFrom(), BeginCopyTo(), and file_fdw_validator().