Re: \copy (query) delimiter syntax error - Mailing list pgsql-hackers
| From | Andrew Dunstan |
|---|---|
| Subject | Re: \copy (query) delimiter syntax error |
| Date | |
| Msg-id | 45C4E870.8080202@dunslane.net Whole thread Raw |
| In response to | Re: \copy (query) delimiter syntax error (Michael Fuhr <mike@fuhr.org>) |
| Responses |
Re: \copy (query) delimiter syntax error
|
| List | pgsql-hackers |
Michael Fuhr wrote:
> On Sat, Feb 03, 2007 at 10:52:29AM -0600, Andrew Dunstan wrote:
>
>> I'd say fix psql. Not sure how far back we should backpatch it. It's
>> interesting that this has been there since 8.0 and is only now discovered.
>>
>
> The problem is new in 8.2 because COPY (query) doesn't support USING
> DELIMITERS. COPY tablename does, so it has worked all along.
>
>
oh, good point. OK, I have cut this quick patch that will continue to
accept the legacy syntax in psql in non-inline-query cases, but will
make psql unreservedly emit new style syntax for COPY to the backend.
Does that seem reasonable, or is it too much of a change for the stable
branch?
cheers
andrew
Index: src/bin/psql/copy.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/copy.c,v
retrieving revision 1.72
diff -c -r1.72 copy.c
*** src/bin/psql/copy.c 5 Jan 2007 22:19:49 -0000 1.72
--- src/bin/psql/copy.c 3 Feb 2007 19:37:34 -0000
***************
*** 118,123 ****
--- 118,124 ----
char *token;
const char *whitespace = " \t\n\r";
char nonstd_backslash = standard_strings() ? 0 : '\\';
+ bool have_query = false;
if (args)
line = pg_strdup(args);
***************
*** 163,168 ****
--- 164,170 ----
xstrcat(&result->table, " ");
xstrcat(&result->table, token);
}
+ have_query = true;
}
token = strtokx(NULL, whitespace, ".,()", "\"",
***************
*** 268,291 ****
0, false, false, pset.encoding);
/*
! * Allows old COPY syntax for backward compatibility 2002-06-19
*/
! if (token && pg_strcasecmp(token, "using") == 0)
! {
! token = strtokx(NULL, whitespace, NULL, NULL,
! 0, false, false, pset.encoding);
! if (!(token && pg_strcasecmp(token, "delimiters") == 0))
! goto error;
! }
! if (token && pg_strcasecmp(token, "delimiters") == 0)
{
! token = strtokx(NULL, whitespace, NULL, "'",
! nonstd_backslash, true, false, pset.encoding);
! if (!token)
! goto error;
! result->delim = pg_strdup(token);
! token = strtokx(NULL, whitespace, NULL, NULL,
! 0, false, false, pset.encoding);
}
if (token)
--- 270,297 ----
0, false, false, pset.encoding);
/*
! * Allows old COPY syntax for backward compatibility.
! * Skip if we have an inline query instead of a table name.
*/
! if (! have_query)
{
! if (token && pg_strcasecmp(token, "using") == 0)
! {
! token = strtokx(NULL, whitespace, NULL, NULL,
! 0, false, false, pset.encoding);
! if (!(token && pg_strcasecmp(token, "delimiters") == 0))
! goto error;
! }
! if (token && pg_strcasecmp(token, "delimiters") == 0)
! {
! token = strtokx(NULL, whitespace, NULL, "'",
! nonstd_backslash, true, false, pset.encoding);
! if (!token)
! goto error;
! result->delim = pg_strdup(token);
! token = strtokx(NULL, whitespace, NULL, NULL,
! 0, false, false, pset.encoding);
! }
}
if (token)
***************
*** 480,511 ****
printfPQExpBuffer(&query, "COPY ");
- /* Uses old COPY syntax for backward compatibility 2002-06-19 */
- if (options->binary)
- appendPQExpBuffer(&query, "BINARY ");
-
appendPQExpBuffer(&query, "%s ", options->table);
if (options->column_list)
appendPQExpBuffer(&query, "%s ", options->column_list);
- /* Uses old COPY syntax for backward compatibility 2002-06-19 */
- if (options->oids)
- appendPQExpBuffer(&query, "WITH OIDS ");
-
if (options->from)
appendPQExpBuffer(&query, "FROM STDIN");
else
appendPQExpBuffer(&query, "TO STDOUT");
! /* Uses old COPY syntax for backward compatibility 2002-06-19 */
if (options->delim)
! emit_copy_option(&query, " USING DELIMITERS ", options->delim);
- /* There is no backward-compatible CSV syntax */
if (options->null)
! emit_copy_option(&query, " WITH NULL AS ", options->null);
if (options->csv_mode)
appendPQExpBuffer(&query, " CSV");
--- 486,513 ----
printfPQExpBuffer(&query, "COPY ");
appendPQExpBuffer(&query, "%s ", options->table);
if (options->column_list)
appendPQExpBuffer(&query, "%s ", options->column_list);
if (options->from)
appendPQExpBuffer(&query, "FROM STDIN");
else
appendPQExpBuffer(&query, "TO STDOUT");
! if (options->binary)
! appendPQExpBuffer(&query, " BINARY ");
!
! if (options->oids)
! appendPQExpBuffer(&query, " OIDS ");
!
if (options->delim)
! emit_copy_option(&query, " DELIMITER ", options->delim);
if (options->null)
! emit_copy_option(&query, " NULL AS ", options->null);
if (options->csv_mode)
appendPQExpBuffer(&query, " CSV");
pgsql-hackers by date: