Fix dumping role comments when using --no-role-passwords
authorDaniel Gustafsson <[email protected]>
Thu, 21 Mar 2024 22:31:57 +0000 (23:31 +0100)
committerDaniel Gustafsson <[email protected]>
Thu, 21 Mar 2024 22:31:57 +0000 (23:31 +0100)
Commit 9a83d56b38c added support for allowing pg_dumpall to dump
roles without including passwords, which accidentally made dumps
omit COMMENTs on roles.  This fixes it by using pg_authid to get
the comment.

Backpatch to all supported versions. Patch simultaneously written
independently by Álvaro and myself.

Author: Álvaro Herrera <[email protected]>
Author: Daniel Gustafsson <[email protected]>
Reported-by: Bartosz Chroł <[email protected]>
Discussion: https://postgr.es/m/AS8P194MB1271CDA0ADCA7B75FCD8E767F7332@AS8P194MB1271.EURP194.PROD.OUTLOOK.COM
Discussion: https://postgr.es/m/CAEP4nAz9V4H41_4ESJd1Gf0v%3DdevkqO1%3Dpo91jUw-GJSx8Hxqg%40mail.gmail.com
Backpatch-through: v12

src/bin/pg_dump/pg_dumpall.c

index 491311fe790b1cd42423c8f91977f487dd7065ee..046c0dc3b36708e293ae7b2a10c2203fef85cb8a 100644 (file)
@@ -769,28 +769,31 @@ dumpRoles(PGconn *conn)
                i_is_current_user;
    int         i;
 
-   /* note: rolconfig is dumped later */
+   /*
+    * Notes: rolconfig is dumped later, and pg_authid must be used for
+    * extracting rolcomment regardless of role_catalog.
+    */
    if (server_version >= 90600)
        printfPQExpBuffer(buf,
                          "SELECT oid, rolname, rolsuper, rolinherit, "
                          "rolcreaterole, rolcreatedb, "
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, rolreplication, rolbypassrls, "
-                         "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+                         "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
                          "rolname = current_user AS is_current_user "
                          "FROM %s "
                          "WHERE rolname !~ '^pg_' "
-                         "ORDER BY 2", role_catalog, role_catalog);
+                         "ORDER BY 2", role_catalog);
    else if (server_version >= 90500)
        printfPQExpBuffer(buf,
                          "SELECT oid, rolname, rolsuper, rolinherit, "
                          "rolcreaterole, rolcreatedb, "
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, rolreplication, rolbypassrls, "
-                         "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+                         "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
                          "rolname = current_user AS is_current_user "
                          "FROM %s "
-                         "ORDER BY 2", role_catalog, role_catalog);
+                         "ORDER BY 2", role_catalog);
    else
        printfPQExpBuffer(buf,
                          "SELECT oid, rolname, rolsuper, rolinherit, "
@@ -798,10 +801,10 @@ dumpRoles(PGconn *conn)
                          "rolcanlogin, rolconnlimit, rolpassword, "
                          "rolvaliduntil, rolreplication, "
                          "false as rolbypassrls, "
-                         "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+                         "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
                          "rolname = current_user AS is_current_user "
                          "FROM %s "
-                         "ORDER BY 2", role_catalog, role_catalog);
+                         "ORDER BY 2", role_catalog);
 
    res = executeQuery(conn, buf->data);