Kris Jurka wrote: > > COPY allows DELIMITER and NULL to be specified which don't allow the data > to be copied back in properly. Using any delimiter that could be part of > a backslash escape sequence (\n \0 \t) will break if any of the data has a > character matching the delimiter because it will be escaped and then be > read as a special character. > > It also allows DELIMITER and NULL to overlap. No character in the NULL > specification should be the DELIMITER.
The attached applied patch throws an error if the delimiter appears in the COPY NULL string: test=> copy pg_language to '/tmp/x' with delimiter '|'; COPY test=> copy pg_language to '/tmp/x' with delimiter '|' null '|x'; ERROR: COPY delimiter must not appear in the NULL specification test=> copy pg_language from '/tmp/x' with delimiter '|' null '|x'; ERROR: COPY delimiter must not appear in the NULL specification It also throws an error if it conflicts with the default NULL string: test=> copy pg_language to '/tmp/x' with delimiter '\\'; ERROR: COPY delimiter must not appear in the NULL specification test=> copy pg_language to '/tmp/x' with delimiter '\\' NULL 'x'; COPY -- Bruce Momjian | http://candle.pha.pa.us [EMAIL PROTECTED] | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/backend/commands/copy.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/commands/copy.c,v retrieving revision 1.218 diff -c -c -r1.218 copy.c *** src/backend/commands/copy.c 10 Feb 2004 01:55:24 -0000 1.218 --- src/backend/commands/copy.c 6 Apr 2004 13:16:35 -0000 *************** *** 780,785 **** --- 780,793 ---- errmsg("COPY delimiter must be a single character"))); /* + * Don't allow the delimiter to appear in the null string. + */ + if (strchr(null_print, delim[0]) != NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("COPY delimiter must not appear in the NULL specification"))); + + /* * Don't allow COPY w/ OIDs to or from a table without them */ if (oids && !rel->rd_rel->relhasoids)
---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://archives.postgresql.org