statement ok
ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES GRANT USAGE ON SCHEMAS TO PUBLIC;
ALTER DEFAULT PRIVILEGES GRANT SELECT ON SEQUENCES TO PUBLIC;
ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

# Public should appear as an empty string with privileges.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
1451375629  1546506610  0                r              {=r/}
1451375629  1546506610  0                S              {=r/}
1451375629  1546506610  0                n              {=U/}
1451375629  1546506610  0                f              {root=X/}

statement ok
ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO PUBLIC;

statement ok
CREATE USER foo

statement ok
CREATE USER bar

statement ok
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON TYPES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON FUNCTIONS TO foo, bar WITH GRANT OPTION;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

statement ok
GRANT foo, bar TO root;

statement ok
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar GRANT ALL ON TABLES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar GRANT ALL ON TYPES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar GRANT ALL ON SCHEMAS TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar GRANT ALL ON SEQUENCES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar GRANT ALL ON FUNCTIONS TO foo, bar WITH GRANT OPTION;

# 15 rows should exist, 5 for each of root, foo and bar.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,foo=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/,foo=C*U*/}
97389596    1791217281  0                f              {bar=X*/,foo=X*/,=X/}
3755498903  2026795574  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/}
3755498903  2026795574  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {bar=U*/,foo=U*/,=U/}
3755498903  2026795574  0                n              {bar=C*U*/,foo=C*U*/}
3755498903  2026795574  0                f              {bar=X*/,foo=X*/,=X/}
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

statement ok
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar REVOKE ALL ON TABLES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar REVOKE ALL ON TYPES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar REVOKE ALL ON SCHEMAS FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar REVOKE ALL ON SEQUENCES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ROLE foo, bar REVOKE ALL ON FUNCTIONS FROM foo, bar;

# Revoking all will result in rows with empty privileges since the privileges
# are revoked from the creator role.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {}
97389596    1791217281  0                S              {}
97389596    1791217281  0                T              {=U/}
97389596    1791217281  0                n              {}
97389596    1791217281  0                f              {=X/}
3755498903  2026795574  0                r              {}
3755498903  2026795574  0                S              {}
3755498903  2026795574  0                T              {=U/}
3755498903  2026795574  0                n              {}
3755498903  2026795574  0                f              {=X/}
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

statement ok
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT ALL ON TABLES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT ALL ON SEQUENCES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT ALL ON SCHEMAS TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT ALL ON TYPES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT ALL ON FUNCTIONS TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE bar GRANT ALL ON TABLES TO bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE bar GRANT ALL ON SEQUENCES TO bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE bar GRANT ALL ON SCHEMAS TO bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE bar GRANT ALL ON TYPES TO bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ROLE bar GRANT ALL ON FUNCTIONS TO bar WITH GRANT OPTION;

# Entries should disappear since the previous ALTER DEFAULT PRIVILEGE commands
# revert the default privileges to the default state.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*r*t*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

# Revoke SELECT from foo and GRANT it back with foo being the creator role.
# Ensure revoking a single privilege reflects correctly.
statement ok
ALTER DEFAULT PRIVILEGES FOR ROLE foo REVOKE SELECT ON TABLES FROM foo;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*t*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

statement ok
ALTER DEFAULT PRIVILEGES FOR ROLE foo GRANT SELECT ON TABLES TO foo;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/,=r/}
1451375629  1546506610  0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/,=r/}
1451375629  1546506610  0                T              {bar=U*/,foo=U*/}
1451375629  1546506610  0                n              {bar=C*U*/,foo=C*U*/,=U/}
1451375629  1546506610  0                f              {bar=X*/,foo=X*/}

statement ok
ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM foo, bar, public;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SCHEMAS FROM foo, bar, public;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SEQUENCES FROM foo, bar, public;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON FUNCTIONS FROM foo, bar, public;

statement ok
ALTER DEFAULT PRIVILEGES REVOKE ALL ON TYPES FROM foo, bar;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                r              {bar=C*a*d*t*w*/,foo=C*a*d*t*w*/}
1451375629  1546506610  0                f              {root=X/}

# GRANT, DROP and ZONECONFIG should not show up in defaclacl.
statement ok
ALTER DEFAULT PRIVILEGES REVOKE ALL ON TABLES FROM foo, bar, public;
ALTER DEFAULT PRIVILEGES GRANT DROP, ZONECONFIG ON TABLES TO foo;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                r              {foo=/}
1451375629  1546506610  0                f              {root=X/}

statement ok
ALTER DEFAULT PRIVILEGES REVOKE DROP, ZONECONFIG ON TABLES FROM foo;

# Check that entries show up for default privileges defined for all roles.
# The defaclrole oid should be 0.
statement ok
ALTER DEFAULT PRIVILEGES FOR ALL ROLES GRANT ALL ON TABLES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES GRANT ALL ON TYPES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES GRANT ALL ON SCHEMAS TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES GRANT ALL ON SEQUENCES TO foo, bar WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES GRANT ALL ON FUNCTIONS TO foo, bar WITH GRANT OPTION;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}
880552153   0           0                r              {bar=C*a*d*r*t*w*/,foo=C*a*d*r*t*w*/}
880552153   0           0                S              {bar=C*U*a*d*r*w*/,foo=C*U*a*d*r*w*/}
880552153   0           0                T              {bar=U*/,foo=U*/}
880552153   0           0                n              {bar=C*U*/,foo=C*U*/}
880552153   0           0                f              {bar=X*/,foo=X*/}

statement ok
ALTER DEFAULT PRIVILEGES FOR ALL ROLES REVOKE ALL ON TABLES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES REVOKE ALL ON TYPES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES REVOKE ALL ON SCHEMAS FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES REVOKE ALL ON SEQUENCES FROM foo, bar;
ALTER DEFAULT PRIVILEGES FOR ALL ROLES REVOKE ALL ON FUNCTIONS FROM foo, bar;

query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}

user testuser

statement ok
ALTER DEFAULT PRIVILEGES REVOKE ALL ON TABLES FROM testuser;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SEQUENCES FROM testuser;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON SCHEMAS FROM testuser;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON TYPES FROM testuser;
ALTER DEFAULT PRIVILEGES REVOKE ALL ON FUNCTIONS FROM testuser;

# Empty entries should appear for testuser indicating that testuser
# has no default privileges.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}
2709666228  2264919399  0                r              {}
2709666228  2264919399  0                S              {}
2709666228  2264919399  0                T              {=U/}
2709666228  2264919399  0                n              {}
2709666228  2264919399  0                f              {=X/}

statement ok
ALTER DEFAULT PRIVILEGES REVOKE USAGE ON TYPES FROM public;

# Revoking privileges from Public should make the entry for T empty.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}
2709666228  2264919399  0                r              {}
2709666228  2264919399  0                S              {}
2709666228  2264919399  0                T              {}
2709666228  2264919399  0                n              {}
2709666228  2264919399  0                f              {=X/}


statement ok
ALTER DEFAULT PRIVILEGES GRANT ALL ON TYPES TO testuser WITH GRANT OPTION;;

# Now that Public does not have USAGE on type but testuser has ALL on types,
# the defaclacl array should show the default privileges for testuser.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}
2709666228  2264919399  0                r              {}
2709666228  2264919399  0                S              {}
2709666228  2264919399  0                T              {testuser=U*/}
2709666228  2264919399  0                n              {}
2709666228  2264919399  0                f              {=X/}

statement ok
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON SEQUENCES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON TYPES TO foo WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES GRANT ALL ON FUNCTIONS TO foo WITH GRANT OPTION;

# Ensure that the empty arrays are populated with the default privileges
# for foo.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
97389596    1791217281  0                r              {bar=C*a*d*r*t*w*/}
97389596    1791217281  0                S              {bar=C*U*a*d*r*w*/}
97389596    1791217281  0                T              {bar=U*/,=U/}
97389596    1791217281  0                n              {bar=C*U*/}
97389596    1791217281  0                f              {bar=X*/,=X/}
3755498903  2026795574  0                r              {foo=C*a*d*rt*w*/}
3755498903  2026795574  0                S              {foo=C*U*a*d*r*w*/}
3755498903  2026795574  0                T              {foo=U*/,=U/}
3755498903  2026795574  0                n              {foo=C*U*/}
3755498903  2026795574  0                f              {foo=X*/,=X/}
1451375629  1546506610  0                f              {root=X/}
2709666228  2264919399  0                r              {foo=C*a*d*r*t*w*/}
2709666228  2264919399  0                S              {foo=C*U*a*d*r*w*/}
2709666228  2264919399  0                T              {foo=U*/,testuser=U*/}
2709666228  2264919399  0                n              {foo=C*U*/}
2709666228  2264919399  0                f              {foo=X*/,=X/}

statement ok
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT SELECT,UPDATE,INSERT,DELETE ON TABLES TO foo;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON SEQUENCES TO foo;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON TYPES TO foo;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC GRANT ALL ON FUNCTIONS TO foo;

# Ensure that the empty arrays are populated with the default privileges
# for foo.
query OOOTT colnames,rowsort
SELECT * FROM PG_CATALOG.PG_DEFAULT_ACL WHERE defaclnamespace != 0
----
oid         defaclrole  defaclnamespace  defaclobjtype  defaclacl
3426387245  2264919399  105              r              {foo=adrw/}
3426387245  2264919399  105              S              {foo=CUadrw/}
3426387245  2264919399  105              T              {foo=U/}
3426387245  2264919399  105              f              {foo=X/}
