David Fetter wrote:
> On Wed, Feb 01, 2006 at 01:16:08AM -0500, Tom Lane wrote:
> > Bruce Momjian <email@example.com> writes:
> > > Attached is a patch that errors for \r and \n in delimiter and
> > > null. I kept the ERRCODE_FEATURE_NOT_SUPPORTED error code because
> > > that is what all the other error tests use in the copy code in
> > > that area.
> > I'd go with INVALID_PARAMETER_VALUE, I think. ISTM that
> > FEATURE_NOT_SUPPORTED is appropriate for places where we might
> > someday support the case the error is rejecting. For instance the
> > error just above your patch is for a multi-character delimiter
> > string. That isn't completely senseless, it's just not implemented.
> > But we're not ever going to allow a delimiter setting that conflicts
> > with end-of-line, and I don't foresee allowing some other value for
> > end-of-line ;-) ... so this check isn't going to be removed someday.
> I don't know why you're saying that the EOL character will never be
> changeable. Other DBs (yes, I know that's not an argument for doing
> this, but please bear with me) let you set the "field separator" aka
> our DELIMITER and "record separator" aka our newline (or CRLF, in some
> cases. Oy!).
> Anyhow, Bruce's patch still allows backslash as a delimiter, which can
> cause *all* kinds of fun if not disallowed.
OK, updated patch, which disallows backslash as a delimiter, and updated
error return code.
Bruce Momjian | http://candle.pha.pa.us
firstname.lastname@example.org | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
RCS file: /cvsroot/pgsql/src/backend/commands/copy.c,v
retrieving revision 1.257
diff -c -c -r1.257 copy.c
*** src/backend/commands/copy.c 28 Dec 2005 03:25:32 -0000 1.257
--- src/backend/commands/copy.c 1 Feb 2006 14:05:53 -0000
*** 856,861 ****
--- 856,880 ----
errmsg("COPY delimiter must be a single
+ /* Disallow end-of-line characters */
+ if (strchr(cstate->delim, '\r') != NULL ||
+ strchr(cstate->delim, '\n') != NULL)
+ errmsg("COPY delimiter cannot be newline or
+ if (strchr(cstate->null_print, '\r') != NULL ||
+ strchr(cstate->null_print, '\n') != NULL)
+ errmsg("COPY null cannot use newline or
+ /* Disallow backslash in non-CSV mode */
+ if (!cstate->csv_mode && strchr(cstate->delim, '\\') != NULL)
+ errmsg("COPY delimiter cannot be backslash")));
/* Check header */
if (!cstate->csv_mode && cstate->header_line)
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?