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) &&

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to