On 02/01/2010 08:06 AM, Tom Lane wrote: > Heikki Linnakangas <[email protected]> writes: >> Fujii Masao wrote: >>> In HEAD, psql using conninfo fails in connecting to the server as follows. >>> >>> $ bin/psql "host=localhost" >>> psql: FATAL: database "host=localhost" does not exist >>> >>> This is because the recently-introduced PQconnectStartParams() >>> doesn't handle correctly the dbname parameter containing '='. > >> Hmm, I don't think that was ever really supposed to work, it was >> accidental that it did. > > No, it was intentional.
Here's a patch. If "=" is found in the dbname psql argument, the argument is assumed to be a conninfo string. In that case, append application_name to the conninfo and use PQsetdbLogin() as before. Otherwise use the new PQconnectdbParams(). Also only uses static assignments for array constructors. Objections? Thanks, Joe
Index: src/bin/psql/startup.c
===================================================================
RCS file: /opt/src/cvs/pgsql/src/bin/psql/startup.c,v
retrieving revision 1.159
diff -c -r1.159 startup.c
*** src/bin/psql/startup.c 28 Jan 2010 06:28:26 -0000 1.159
--- src/bin/psql/startup.c 3 Feb 2010 00:53:08 -0000
***************
*** 90,97 ****
char *password = NULL;
char *password_prompt = NULL;
bool new_pass;
- const char *keywords[] = {"host","port","dbname","user",
- "password","application_name",NULL};
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));
--- 90,95 ----
***************
*** 173,192 ****
/* loop until we have a password if requested by backend */
do
{
! const char *values[] = {
! options.host,
! options.port,
! (options.action == ACT_LIST_DB &&
! options.dbname == NULL) ? "postgres" : options.dbname,
! options.username,
! password,
! pset.progname,
! NULL
! };
!
! new_pass = false;
! pset.db = PQconnectdbParams(keywords, values);
if (PQstatus(pset.db) == CONNECTION_BAD &&
PQconnectionNeedsPassword(pset.db) &&
--- 171,218 ----
/* loop until we have a password if requested by backend */
do
{
! /*
! * If the dbName parameter contains '=', assume it's a conninfo string.
! */
! if (options.dbname && strchr(options.dbname, '='))
! {
! PQExpBuffer dbName = createPQExpBuffer();
!
! appendPQExpBuffer(dbName, "%s application_name=%s",
! options.dbname, pset.progname);
! new_pass = false;
! pset.db = PQsetdbLogin(options.host, options.port, NULL, NULL,
! dbName->data, options.username, password);
! destroyPQExpBuffer(dbName);
! }
! else
! {
! const char *keywords[] = {
! "host",
! "port",
! "dbname",
! "user",
! "password",
! "application_name",
! NULL
! };
! const char **values = pg_malloc(sizeof(keywords));
!
! values[0] = options.host;
! values[1] = options.port;
! values[2] = (options.action == ACT_LIST_DB &&
! options.dbname == NULL) ?
! "postgres" : options.dbname;
! values[3] = options.username;
! values[4] = password;
! values[5] = pset.progname;
! values[6] = NULL;
!
! new_pass = false;
! pset.db = PQconnectdbParams(keywords, values);
! free(values);
! }
if (PQstatus(pset.db) == CONNECTION_BAD &&
PQconnectionNeedsPassword(pset.db) &&
signature.asc
Description: OpenPGP digital signature
