From 969cc16c690d0f23bab9c95a7e26b5ac409ac628 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 4 Dec 2001 21:19:57 +0000 Subject: [PATCH] Enforce restriction that COPY DELIMITERS string must be exactly one character; replace strchr() search with simple comparison to speed up COPY IN. Per discussion in pghackers. --- doc/src/sgml/ref/copy.sgml | 5 +---- src/backend/commands/copy.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 0381610896..df607d500f 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -1,5 +1,5 @@ @@ -227,9 +227,6 @@ ERROR: reason character with the keyword phrase USING DELIMITERS. Characters in data fields which happen to match the delimiter character will be backslash quoted. - Note that the delimiter is always a single character. - If multiple characters are specified in the delimiter string, - only the first character is used. diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 726ae39324..b944279d7e 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.143 2001/12/04 19:40:16 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.144 2001/12/04 21:19:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -288,6 +288,12 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, if (pipe && binary) elog(ERROR, "COPY BINARY is not supported to stdout or from stdin"); + /* + * Presently, only single-character delimiter strings are supported. + */ + if (strlen(delim) != 1) + elog(ERROR, "COPY delimiter must be a single character"); + /* * Set up variables to avoid per-attribute overhead. */ @@ -1009,7 +1015,7 @@ CopyReadNewline(FILE *fp, int *newline) * Note that the caller should not pfree the string! * * *isnull is set true if a null attribute, else false. - * delim is the string of acceptable delimiter characters(s). + * delim is the column delimiter string (currently always 1 character). * *newline remembers whether we've seen a newline ending this tuple. * null_print says how NULL values are represented */ @@ -1018,6 +1024,7 @@ static char * CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_print) { int c; + int delimc = delim[0]; #ifdef MULTIBYTE int mblen; @@ -1051,7 +1058,7 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_ *newline = 1; break; } - if (strchr(delim, c)) + if (c == delimc) break; if (c == '\\') { -- 2.40.0