*** a/src/bin/scripts/vacuumdb.c --- b/src/bin/scripts/vacuumdb.c *************** *** 41,48 **** static void vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, int stage, SimpleStringList *tables, const char *host, const char *port, ! const char *username, enum trivalue prompt_password, ! int concurrentCons, const char *progname, bool echo, bool quiet); static void vacuum_all_databases(vacuumingOptions *vacopts, --- 41,48 ---- int stage, SimpleStringList *tables, const char *host, const char *port, ! const char *username, char **password_user, ! enum trivalue prompt_password, int concurrentCons, const char *progname, bool echo, bool quiet); static void vacuum_all_databases(vacuumingOptions *vacopts, *************** *** 275,280 **** main(int argc, char *argv[]) --- 275,282 ---- } else { + char *password = NULL; + if (dbname == NULL) { if (getenv("PGDATABASE")) *************** *** 294,300 **** main(int argc, char *argv[]) vacuum_one_database(dbname, &vacopts, stage, &tables, ! host, port, username, prompt_password, concurrentCons, progname, echo, quiet); } --- 296,303 ---- vacuum_one_database(dbname, &vacopts, stage, &tables, ! host, port, username, ! &password, prompt_password, concurrentCons, progname, echo, quiet); } *************** *** 303,311 **** main(int argc, char *argv[]) vacuum_one_database(dbname, &vacopts, ANALYZE_NO_STAGE, &tables, ! host, port, username, prompt_password, concurrentCons, progname, echo, quiet); } exit(0); --- 306,319 ---- vacuum_one_database(dbname, &vacopts, ANALYZE_NO_STAGE, &tables, ! host, port, username, ! &password, prompt_password, concurrentCons, progname, echo, quiet); + + /* Free the password memory in case if it supplied */ + if (password) + pfree(password); } exit(0); *************** *** 329,336 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, int stage, SimpleStringList *tables, const char *host, const char *port, ! const char *username, enum trivalue prompt_password, ! int concurrentCons, const char *progname, bool echo, bool quiet) { PQExpBufferData sql; --- 337,344 ---- int stage, SimpleStringList *tables, const char *host, const char *port, ! const char *username, char **password_user, ! enum trivalue prompt_password, int concurrentCons, const char *progname, bool echo, bool quiet) { PQExpBufferData sql; *************** *** 354,359 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, --- 362,368 ---- Assert(stage == ANALYZE_NO_STAGE || (stage >= 0 && stage < ANALYZE_NUM_STAGES)); + Assert(password_user != NULL); if (!quiet) { *************** *** 365,373 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, fflush(stdout); } ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); initPQExpBuffer(&sql); /* --- 374,392 ---- fflush(stdout); } ! conn = connectDatabase(dbname, host, port, username, *password_user, prompt_password, progname, false); + /* + * The following code is required to handle the case of vacuumdb --all. + * By the configuration, if user doesn't supply a password during the + * connection to the maintainance database and it may be required for + * the user database. So we will use this password for the rest of the + * connections to the server. + */ + if (PQconnectionUsedPassword(conn) && (*password_user == NULL)) + *password_user = pstrdup(PQpass(conn)); + initPQExpBuffer(&sql); /* *************** *** 547,555 **** vacuum_all_databases(vacuumingOptions *vacopts, --- 566,578 ---- PGresult *result; int stage; int i; + char *password = NULL; conn = connectMaintenanceDatabase(maintenance_db, host, port, username, prompt_password, progname); + if (PQconnectionUsedPassword(conn)) + password = pstrdup(PQpass(conn)); + result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", progname, echo); *************** *** 575,581 **** vacuum_all_databases(vacuumingOptions *vacopts, vacuum_one_database(dbname, vacopts, stage, NULL, ! host, port, username, prompt_password, concurrentCons, progname, echo, quiet); } --- 598,605 ---- vacuum_one_database(dbname, vacopts, stage, NULL, ! host, port, username, ! &password, prompt_password, concurrentCons, progname, echo, quiet); } *************** *** 591,602 **** vacuum_all_databases(vacuumingOptions *vacopts, vacuum_one_database(dbname, vacopts, ANALYZE_NO_STAGE, NULL, ! host, port, username, prompt_password, concurrentCons, progname, echo, quiet); } } PQclear(result); } --- 615,629 ---- vacuum_one_database(dbname, vacopts, ANALYZE_NO_STAGE, NULL, ! host, port, username, ! &password, prompt_password, concurrentCons, progname, echo, quiet); } } + if (password) + pfree(password); PQclear(result); }