diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 3c836f2293..d66f83d8ba 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1963,12 +1963,29 @@ exec_command_password(PsqlScanState scan_state, bool active_branch) if (active_branch) { - char *opt0 = psql_scan_slash_option(scan_state, + char *user = psql_scan_slash_option(scan_state, OT_SQLID, NULL, true); char pw1[100]; char pw2[100]; + PQExpBufferData buf; - simple_prompt("Enter new password: ", pw1, sizeof(pw1), false); + if (user == NULL) + { + /* By default, the command applies to CURRENT_USER */ + PGresult *res; + + res = PSQLexec("SELECT CURRENT_USER"); + if (!res) + return PSQL_CMD_ERROR; + + user = pg_strdup(PQgetvalue(res, 0, 0)); + PQclear(res); + } + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, _("Enter new password for user \"%s\": "), user); + + simple_prompt(buf.data, pw1, sizeof(pw1), false); simple_prompt("Enter it again: ", pw2, sizeof(pw2), false); if (strcmp(pw1, pw2) != 0) @@ -1978,14 +1995,8 @@ exec_command_password(PsqlScanState scan_state, bool active_branch) } else { - char *user; char *encrypted_password; - if (opt0) - user = opt0; - else - user = PQuser(pset.db); - encrypted_password = PQencryptPasswordConn(pset.db, pw1, user, NULL); if (!encrypted_password) @@ -1995,15 +2006,12 @@ exec_command_password(PsqlScanState scan_state, bool active_branch) } else { - PQExpBufferData buf; PGresult *res; - initPQExpBuffer(&buf); printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD ", fmtId(user)); appendStringLiteralConn(&buf, encrypted_password, pset.db); res = PSQLexec(buf.data); - termPQExpBuffer(&buf); if (!res) success = false; else @@ -2012,8 +2020,8 @@ exec_command_password(PsqlScanState scan_state, bool active_branch) } } - if (opt0) - free(opt0); + free(user); + termPQExpBuffer(&buf); } else ignore_slash_options(scan_state);