'PostgreSQL role IS and IS NOT a member of another role?

What am I missing here? Or how do I fix?

lake=> REVOKE app_cdc FROM app_flyway;
WARNING:  role "app_flyway" is not a member of role "app_cdc"
lake=> GRANT app_flyway TO app_cdc;
ERROR:  role "app_flyway" is a member of role "app_cdc"

ae_lake=> \du app_cdc;
                List of roles
Role name | Attributes |                          Member of
-----------+------------+--------------------------------------------------------------
app_cdc   |            | {grp_datalake_reader,grp_datalake_writer,grp_read,grp_write}

ae_lake=> \du app_flyway;
                List of roles
Role name  | Attributes |         Member of
------------+------------+---------------------------
app_flyway |            | {grp_admin,grp_admin_pii}

Clearly app_flyway is not a member of app_cdc. But app_cdc is also clearly not a member of app_flyway.

Then, I thought about membership of the grp_* roles. So I did this:

lake.cdc> REVOKE app_flyway FROM grp_datalake_reader, grp_datalake_writer, grp_read, grp_write
[2022-02-04 13:19:31] [01000] role "grp_datalake_reader" is not a member of role "app_flyway"
[2022-02-04 13:19:31] [01000] role "grp_datalake_writer" is not a member of role "app_flyway"
[2022-02-04 13:19:31] [01000] role "grp_read" is not a member of role "app_flyway"
[2022-02-04 13:19:31] [01000] role "grp_write" is not a member of role "app_flyway"
[2022-02-04 13:19:31] completed in 146 ms
lake.cdc> GRANT app_flyway TO app_cdc
[2022-02-04 13:19:39] [0LP01] ERROR: role "app_flyway" is a member of role "app_cdc"

And, for good measure:

lake.cdc> REVOKE app_cdc FROM grp_datalake_reader, grp_datalake_writer, grp_read, grp_write
[2022-02-04 13:21:57] [01000] role "grp_datalake_reader" is not a member of role "app_cdc"
[2022-02-04 13:21:57] [01000] role "grp_datalake_writer" is not a member of role "app_cdc"
[2022-02-04 13:21:57] [01000] role "grp_read" is not a member of role "app_cdc"
[2022-02-04 13:21:57] [01000] role "grp_write" is not a member of role "app_cdc"
[2022-02-04 13:21:57] completed in 145 ms
lake.cdc> GRANT app_flyway TO app_cdc
[2022-02-04 13:22:02] [0LP01] ERROR: role "app_flyway" is a member of role "app_cdc"

Weirder still:

lake=> REVOKE app_flyway FROM grp_admin,grp_admin_pii;
WARNING:  role "grp_admin" is not a member of role "app_flyway"
WARNING:  role "grp_admin_pii" is not a member of role "app_flyway"
REVOKE ROLE
lake=> \du app_flyway;
                    List of roles
 Role name  | Attributes |         Member of
------------+------------+---------------------------
 app_flyway |            | {grp_admin,grp_admin_pii}


Solution 1:[1]

OK, this fixed. Sorry to bug folks.

REVOKE app_cdc FROM grp_admin;
REVOKE app_cdc FROM grp_admin_pii;
GRANT app_flyway TO app_cdc;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 quickdraw