In pg_upgrade, fix bug where no users were dumped in pg_dumpall
authorBruce Momjian
Tue, 4 Dec 2012 00:43:02 +0000 (19:43 -0500)
committerBruce Momjian
Tue, 4 Dec 2012 00:43:02 +0000 (19:43 -0500)
binary-upgrade mode;  instead only skip dumping the current user.

This bug was introduced in during the removal of split_old_dump().  Bug
discovered during local testing.

src/bin/pg_dump/pg_dumpall.c

index aa4fcbb2b3c9f7677648095a2ac6e58038fe23d4..088106fae085a2a2ec662e027a7d79e7cf62e606 100644 (file)
@@ -642,7 +642,8 @@ dumpRoles(PGconn *conn)
                i_rolpassword,
                i_rolvaliduntil,
                i_rolreplication,
-               i_rolcomment;
+               i_rolcomment,
+               i_is_current_user;
    int         i;
 
    /* note: rolconfig is dumped later */
@@ -652,7 +653,8 @@ dumpRoles(PGconn *conn)
                          "rolcreaterole, rolcreatedb, "
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, rolreplication, "
-             "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
+             "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
+                         "rolname = current_user AS is_current_user "
                          "FROM pg_authid "
                          "ORDER BY 2");
    else if (server_version >= 80200)
@@ -661,7 +663,8 @@ dumpRoles(PGconn *conn)
                          "rolcreaterole, rolcreatedb, "
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, false as rolreplication, "
-             "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
+             "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
+                         "rolname = current_user AS is_current_user "
                          "FROM pg_authid "
                          "ORDER BY 2");
    else if (server_version >= 80100)
@@ -670,7 +673,8 @@ dumpRoles(PGconn *conn)
                          "rolcreaterole, rolcreatedb, "
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, false as rolreplication, "
-                         "null as rolcomment "
+                         "null as rolcomment, "
+                         "rolname = current_user AS is_current_user "
                          "FROM pg_authid "
                          "ORDER BY 2");
    else
@@ -685,7 +689,8 @@ dumpRoles(PGconn *conn)
                          "passwd as rolpassword, "
                          "valuntil as rolvaliduntil, "
                          "false as rolreplication, "
-                         "null as rolcomment "
+                         "null as rolcomment, "
+                         "rolname = current_user AS is_current_user "
                          "FROM pg_shadow "
                          "UNION ALL "
                          "SELECT 0, groname as rolname, "
@@ -698,7 +703,7 @@ dumpRoles(PGconn *conn)
                          "null::text as rolpassword, "
                          "null::abstime as rolvaliduntil, "
                          "false as rolreplication, "
-                         "null as rolcomment "
+                         "null as rolcomment, false "
                          "FROM pg_group "
                          "WHERE NOT EXISTS (SELECT 1 FROM pg_shadow "
                          " WHERE usename = groname) "
@@ -718,6 +723,7 @@ dumpRoles(PGconn *conn)
    i_rolvaliduntil = PQfnumber(res, "rolvaliduntil");
    i_rolreplication = PQfnumber(res, "rolreplication");
    i_rolcomment = PQfnumber(res, "rolcomment");
+   i_is_current_user = PQfnumber(res, "is_current_user");
 
    if (PQntuples(res) > 0)
        fprintf(OPF, "--\n-- Roles\n--\n\n");
@@ -746,9 +752,10 @@ dumpRoles(PGconn *conn)
         * won't hurt for the CREATE to fail).  This is particularly important
         * for the role we are connected as, since even with --clean we will
         * have failed to drop it.  binary_upgrade cannot generate any errors,
-        * so we assume the role is already created.
+        * so we assume the current role is already created.
         */
-       if (!binary_upgrade)
+       if (!binary_upgrade ||
+           strcmp(PQgetvalue(res, i, i_is_current_user), "f") == 0)
            appendPQExpBuffer(buf, "CREATE ROLE %s;\n", fmtId(rolename));
        appendPQExpBuffer(buf, "ALTER ROLE %s WITH", fmtId(rolename));