On 02/01/2010 08:06 AM, Tom Lane wrote: > Heikki Linnakangas <heikki.linnakan...@enterprisedb.com> 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