OSDN Git Service

Enforce restriction that COPY DELIMITERS string must be exactly one
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Dec 2001 21:19:57 +0000 (21:19 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Dec 2001 21:19:57 +0000 (21:19 +0000)
character; replace strchr() search with simple comparison to speed up
COPY IN.  Per discussion in pghackers.

doc/src/sgml/ref/copy.sgml
src/backend/commands/copy.c

index 0381610..df607d5 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/copy.sgml,v 1.24 2001/09/13 15:55:24 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/copy.sgml,v 1.25 2001/12/04 21:19:57 tgl Exp $
 Postgres documentation
 -->
 
@@ -227,9 +227,6 @@ ERROR: <replaceable>reason</replaceable>
     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.
    </para>
    
    <para>
index 726ae39..b944279 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -289,6 +289,12 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
                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.
         */
        initStringInfo(&attribute_buf);
@@ -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 == '\\')
                {