Stephen Frost wrote: -- Start of PGP signed section. > Greetings, > > psql seems to accept syntax which would be rejected by the server, > which seems a bit odd: > > sfrost*=# \copy billing_data from ../BillingSamplePricerFile.csv > with csv header quote as '"' null as 'abc' null as '123' > ERROR: invalid input syntax for integer: "" > > vs. > > sfrost=# copy billing_data from stdin > with csv header quote as '"' null as 'abc' null as '123'; > ERROR: conflicting or redundant options > > Now, honestly, I'd like to see support for multiple 'NULL AS' strings, > but till that's added it'd probably be best if psql error'd on this > like the backend does rather than accepting it and then not doing it.
I have fixed this bug with the attached patch to CVS HEAD. test=> \copy billing_data from ../BillingSamplePricerFile.csv with csv header quote as '"' null as 'abc' null as '123' \copy: parse error at "null" -- Bruce Momjian <[EMAIL PROTECTED]> http://momjian.us EnterpriseDB http://postgres.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/copy.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/copy.c,v retrieving revision 1.77 diff -c -c -r1.77 copy.c *** src/bin/psql/copy.c 1 Jan 2008 19:45:55 -0000 1.77 --- src/bin/psql/copy.c 11 Mar 2008 23:27:15 -0000 *************** *** 274,279 **** --- 274,281 ---- result->header = true; else if (pg_strcasecmp(token, "delimiter") == 0) { + if (result->delim) + goto error; token = strtokx(NULL, whitespace, NULL, "'", nonstd_backslash, true, false, pset.encoding); if (token && pg_strcasecmp(token, "as") == 0) *************** *** 286,291 **** --- 288,295 ---- } else if (pg_strcasecmp(token, "null") == 0) { + if (result->null) + goto error; token = strtokx(NULL, whitespace, NULL, "'", nonstd_backslash, true, false, pset.encoding); if (token && pg_strcasecmp(token, "as") == 0) *************** *** 298,303 **** --- 302,309 ---- } else if (pg_strcasecmp(token, "quote") == 0) { + if (result->quote) + goto error; token = strtokx(NULL, whitespace, NULL, "'", nonstd_backslash, true, false, pset.encoding); if (token && pg_strcasecmp(token, "as") == 0) *************** *** 310,315 **** --- 316,323 ---- } else if (pg_strcasecmp(token, "escape") == 0) { + if (result->escape) + goto error; token = strtokx(NULL, whitespace, NULL, "'", nonstd_backslash, true, false, pset.encoding); if (token && pg_strcasecmp(token, "as") == 0) *************** *** 326,331 **** --- 334,341 ---- 0, false, false, pset.encoding); if (pg_strcasecmp(token, "quote") == 0) { + if (result->force_quote_list) + goto error; /* handle column list */ fetch_next = false; for (;;) *************** *** 347,352 **** --- 357,364 ---- } else if (pg_strcasecmp(token, "not") == 0) { + if (result->force_notnull_list) + goto error; token = strtokx(NULL, whitespace, ",", "\"", 0, false, false, pset.encoding); if (pg_strcasecmp(token, "null") != 0)
-- Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-patches