diff --git a/src/backend/libpq/crypt.c b/src/backend/libpq/crypt.c
index 97be944..64c25e8 100644
*** a/src/backend/libpq/crypt.c
--- b/src/backend/libpq/crypt.c
*************** md5_crypt_verify(const Port *port, const
*** 50,56 ****
--- 50,60 ----
  	/* Get role info from pg_authid */
  	roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(role));
  	if (!HeapTupleIsValid(roleTup))
+ 	{
+ 		*logdetail = psprintf(_("Role \"%s\" does not exist."),
+ 							  role);
  		return STATUS_ERROR;	/* no such user */
+ 	}
  
  	datum = SysCacheGetAttr(AUTHNAME, roleTup,
  							Anum_pg_authid_rolpassword, &isnull);
*************** md5_crypt_verify(const Port *port, const
*** 71,83 ****
  	ReleaseSysCache(roleTup);
  
  	if (*shadow_pass == '\0')
  		return STATUS_ERROR;	/* empty password */
! 
! 	CHECK_FOR_INTERRUPTS();
  
  	/*
  	 * Compare with the encrypted or plain password depending on the
! 	 * authentication method being used for this connection.
  	 */
  	switch (port->hba->auth_method)
  	{
--- 75,92 ----
  	ReleaseSysCache(roleTup);
  
  	if (*shadow_pass == '\0')
+ 	{
+ 		*logdetail = psprintf(_("User \"%s\" has an empty password."),
+ 							  role);
  		return STATUS_ERROR;	/* empty password */
! 	}
  
  	/*
  	 * Compare with the encrypted or plain password depending on the
! 	 * authentication method being used for this connection.  (We do not
! 	 * bother setting logdetail for pg_md5_encrypt failure: the only possible
! 	 * error is out-of-memory, which is unlikely, and if it did happen adding
! 	 * a psprintf call would only make things worse.)
  	 */
  	switch (port->hba->auth_method)
  	{
*************** md5_crypt_verify(const Port *port, const
*** 154,159 ****
--- 163,171 ----
  		else
  			retval = STATUS_OK;
  	}
+ 	else
+ 		*logdetail = psprintf(_("Password does not match for user \"%s\"."),
+ 							  role);
  
  	if (port->hba->auth_method == uaMD5)
  		pfree(crypt_pwd);
