Commit 86a07143 authored by Tom Lane's avatar Tom Lane

Tweak psql's \connect command to not downcase unquoted database and user

names.  This is a temporary measure to allow backwards compatibility with
7.2 and earlier pg_dump.  7.2.1 and later pg_dump will double-quote mixed
case names in \connect.  Once we feel that older dumps are not a problem
anymore, we can revert this change and treat \connect arguments as normal
SQL identifiers.
parent 7cfbbb25
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.65 2002/02/20 22:47:12 tgl Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.66 2002/02/25 21:37:42 tgl Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "command.h" #include "command.h"
...@@ -54,11 +54,17 @@ static backslashResult exec_command(const char *cmd, ...@@ -54,11 +54,17 @@ static backslashResult exec_command(const char *cmd,
const char **continue_parse, const char **continue_parse,
PQExpBuffer query_buf); PQExpBuffer query_buf);
/* different ways for scan_option to handle parameter words */
enum option_type enum option_type
{ {
OT_NORMAL, OT_SQLID, OT_FILEPIPE OT_NORMAL, /* normal case */
OT_SQLID, /* treat as SQL identifier */
OT_SQLIDHACK, /* SQL identifier, but don't downcase */
OT_FILEPIPE /* it's a file or pipe */
}; };
static char *scan_option(char **string, enum option_type type, char *quote, bool semicolon);
static char *scan_option(char **string, enum option_type type,
char *quote, bool semicolon);
static char *unescape(const unsigned char *source, size_t len); static char *unescape(const unsigned char *source, size_t len);
static bool do_edit(const char *filename_arg, PQExpBuffer query_buf); static bool do_edit(const char *filename_arg, PQExpBuffer query_buf);
...@@ -243,8 +249,17 @@ exec_command(const char *cmd, ...@@ -243,8 +249,17 @@ exec_command(const char *cmd,
char opt1q, char opt1q,
opt2q; opt2q;
opt1 = scan_option(&string, OT_SQLID, &opt1q, true); /*
opt2 = scan_option(&string, OT_SQLID, &opt2q, true); * Ideally we should treat the arguments as SQL identifiers. But for
* backwards compatibility with 7.2 and older pg_dump files, we have
* to take unquoted arguments verbatim (don't downcase them).
* For now, double-quoted arguments may be stripped of double quotes
* (as if SQL identifiers). By 7.4 or so, pg_dump files can be
* expected to double-quote all mixed-case \connect arguments,
* and then we can get rid of OT_SQLIDHACK.
*/
opt1 = scan_option(&string, OT_SQLIDHACK, &opt1q, true);
opt2 = scan_option(&string, OT_SQLIDHACK, &opt2q, true);
if (opt2) if (opt2)
/* gave username */ /* gave username */
...@@ -909,7 +924,7 @@ scan_option(char **string, enum option_type type, char *quote, bool semicolon) ...@@ -909,7 +924,7 @@ scan_option(char **string, enum option_type type, char *quote, bool semicolon)
* then we strip out the double quotes * then we strip out the double quotes
*/ */
if (type == OT_SQLID) if (type == OT_SQLID || type == OT_SQLIDHACK)
{ {
unsigned int k, unsigned int k,
cc; cc;
...@@ -930,7 +945,6 @@ scan_option(char **string, enum option_type type, char *quote, bool semicolon) ...@@ -930,7 +945,6 @@ scan_option(char **string, enum option_type type, char *quote, bool semicolon)
} }
return_val[cc] = '\0'; return_val[cc] = '\0';
} }
else else
{ {
strncpy(return_val, &options_string[pos], jj - pos + 1); strncpy(return_val, &options_string[pos], jj - pos + 1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment