@@ -113,6 +113,7 @@ static AclMode convert_role_priv_string(text *priv_type_text);
113113static AclResult pg_role_aclcheck (Oid role_oid ,Oid roleid ,AclMode mode );
114114
115115static void RoleMembershipCacheCallback (Datum arg ,int cacheid ,ItemPointer tuplePtr );
116+ static Oid get_role_oid_or_public (const char * rolname );
116117
117118
118119/*
@@ -1791,7 +1792,7 @@ has_table_privilege_name_name(PG_FUNCTION_ARGS)
17911792AclMode mode ;
17921793AclResult aclresult ;
17931794
1794- roleid = get_role_oid (NameStr (* rolename ), false );
1795+ roleid = get_role_oid_or_public (NameStr (* rolename ));
17951796tableoid = convert_table_name (tablename );
17961797mode = convert_table_priv_string (priv_type_text );
17971798
@@ -1840,7 +1841,7 @@ has_table_privilege_name_id(PG_FUNCTION_ARGS)
18401841AclMode mode ;
18411842AclResult aclresult ;
18421843
1843- roleid = get_role_oid (NameStr (* username ), false );
1844+ roleid = get_role_oid_or_public (NameStr (* username ));
18441845mode = convert_table_priv_string (priv_type_text );
18451846
18461847if (!SearchSysCacheExists1 (RELOID ,ObjectIdGetDatum (tableoid )))
@@ -1998,7 +1999,7 @@ has_sequence_privilege_name_name(PG_FUNCTION_ARGS)
19981999AclMode mode ;
19992000AclResult aclresult ;
20002001
2001- roleid = get_role_oid (NameStr (* rolename ), false );
2002+ roleid = get_role_oid_or_public (NameStr (* rolename ));
20022003mode = convert_sequence_priv_string (priv_type_text );
20032004sequenceoid = convert_table_name (sequencename );
20042005if (get_rel_relkind (sequenceoid )!= RELKIND_SEQUENCE )
@@ -2058,7 +2059,7 @@ has_sequence_privilege_name_id(PG_FUNCTION_ARGS)
20582059AclResult aclresult ;
20592060char relkind ;
20602061
2061- roleid = get_role_oid (NameStr (* username ), false );
2062+ roleid = get_role_oid_or_public (NameStr (* username ));
20622063mode = convert_sequence_priv_string (priv_type_text );
20632064relkind = get_rel_relkind (sequenceoid );
20642065if (relkind == '\0' )
@@ -2209,7 +2210,7 @@ has_any_column_privilege_name_name(PG_FUNCTION_ARGS)
22092210AclMode mode ;
22102211AclResult aclresult ;
22112212
2212- roleid = get_role_oid (NameStr (* rolename ), false );
2213+ roleid = get_role_oid_or_public (NameStr (* rolename ));
22132214tableoid = convert_table_name (tablename );
22142215mode = convert_column_priv_string (priv_type_text );
22152216
@@ -2266,7 +2267,7 @@ has_any_column_privilege_name_id(PG_FUNCTION_ARGS)
22662267AclMode mode ;
22672268AclResult aclresult ;
22682269
2269- roleid = get_role_oid (NameStr (* username ), false );
2270+ roleid = get_role_oid_or_public (NameStr (* username ));
22702271mode = convert_column_priv_string (priv_type_text );
22712272
22722273if (!SearchSysCacheExists1 (RELOID ,ObjectIdGetDatum (tableoid )))
@@ -2451,7 +2452,7 @@ has_column_privilege_name_name_name(PG_FUNCTION_ARGS)
24512452AclMode mode ;
24522453int privresult ;
24532454
2454- roleid = get_role_oid (NameStr (* rolename ), false );
2455+ roleid = get_role_oid_or_public (NameStr (* rolename ));
24552456tableoid = convert_table_name (tablename );
24562457colattnum = convert_column_name (tableoid ,column );
24572458mode = convert_column_priv_string (priv_type_text );
@@ -2479,7 +2480,7 @@ has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS)
24792480AclMode mode ;
24802481int privresult ;
24812482
2482- roleid = get_role_oid (NameStr (* rolename ), false );
2483+ roleid = get_role_oid_or_public (NameStr (* rolename ));
24832484tableoid = convert_table_name (tablename );
24842485mode = convert_column_priv_string (priv_type_text );
24852486
@@ -2506,7 +2507,7 @@ has_column_privilege_name_id_name(PG_FUNCTION_ARGS)
25062507AclMode mode ;
25072508int privresult ;
25082509
2509- roleid = get_role_oid (NameStr (* username ), false );
2510+ roleid = get_role_oid_or_public (NameStr (* username ));
25102511colattnum = convert_column_name (tableoid ,column );
25112512mode = convert_column_priv_string (priv_type_text );
25122513
@@ -2532,7 +2533,7 @@ has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS)
25322533AclMode mode ;
25332534int privresult ;
25342535
2535- roleid = get_role_oid (NameStr (* username ), false );
2536+ roleid = get_role_oid_or_public (NameStr (* username ));
25362537mode = convert_column_priv_string (priv_type_text );
25372538
25382539privresult = column_privilege_check (tableoid ,colattnum ,roleid ,mode );
@@ -2823,7 +2824,7 @@ has_database_privilege_name_name(PG_FUNCTION_ARGS)
28232824AclMode mode ;
28242825AclResult aclresult ;
28252826
2826- roleid = get_role_oid (NameStr (* username ), false );
2827+ roleid = get_role_oid_or_public (NameStr (* username ));
28272828databaseoid = convert_database_name (databasename );
28282829mode = convert_database_priv_string (priv_type_text );
28292830
@@ -2872,7 +2873,7 @@ has_database_privilege_name_id(PG_FUNCTION_ARGS)
28722873AclMode mode ;
28732874AclResult aclresult ;
28742875
2875- roleid = get_role_oid (NameStr (* username ), false );
2876+ roleid = get_role_oid_or_public (NameStr (* username ));
28762877mode = convert_database_priv_string (priv_type_text );
28772878
28782879if (!SearchSysCacheExists1 (DATABASEOID ,ObjectIdGetDatum (databaseoid )))
@@ -3021,7 +3022,7 @@ has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS)
30213022AclMode mode ;
30223023AclResult aclresult ;
30233024
3024- roleid = get_role_oid (NameStr (* username ), false );
3025+ roleid = get_role_oid_or_public (NameStr (* username ));
30253026fdwid = convert_foreign_data_wrapper_name (fdwname );
30263027mode = convert_foreign_data_wrapper_priv_string (priv_type_text );
30273028
@@ -3070,7 +3071,7 @@ has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS)
30703071AclMode mode ;
30713072AclResult aclresult ;
30723073
3073- roleid = get_role_oid (NameStr (* username ), false );
3074+ roleid = get_role_oid_or_public (NameStr (* username ));
30743075mode = convert_foreign_data_wrapper_priv_string (priv_type_text );
30753076
30763077aclresult = pg_foreign_data_wrapper_aclcheck (fdwid ,roleid ,mode );
@@ -3203,7 +3204,7 @@ has_function_privilege_name_name(PG_FUNCTION_ARGS)
32033204AclMode mode ;
32043205AclResult aclresult ;
32053206
3206- roleid = get_role_oid (NameStr (* username ), false );
3207+ roleid = get_role_oid_or_public (NameStr (* username ));
32073208functionoid = convert_function_name (functionname );
32083209mode = convert_function_priv_string (priv_type_text );
32093210
@@ -3252,7 +3253,7 @@ has_function_privilege_name_id(PG_FUNCTION_ARGS)
32523253AclMode mode ;
32533254AclResult aclresult ;
32543255
3255- roleid = get_role_oid (NameStr (* username ), false );
3256+ roleid = get_role_oid_or_public (NameStr (* username ));
32563257mode = convert_function_priv_string (priv_type_text );
32573258
32583259if (!SearchSysCacheExists1 (PROCOID ,ObjectIdGetDatum (functionoid )))
@@ -3403,7 +3404,7 @@ has_language_privilege_name_name(PG_FUNCTION_ARGS)
34033404AclMode mode ;
34043405AclResult aclresult ;
34053406
3406- roleid = get_role_oid (NameStr (* username ), false );
3407+ roleid = get_role_oid_or_public (NameStr (* username ));
34073408languageoid = convert_language_name (languagename );
34083409mode = convert_language_priv_string (priv_type_text );
34093410
@@ -3452,7 +3453,7 @@ has_language_privilege_name_id(PG_FUNCTION_ARGS)
34523453AclMode mode ;
34533454AclResult aclresult ;
34543455
3455- roleid = get_role_oid (NameStr (* username ), false );
3456+ roleid = get_role_oid_or_public (NameStr (* username ));
34563457mode = convert_language_priv_string (priv_type_text );
34573458
34583459if (!SearchSysCacheExists1 (LANGOID ,ObjectIdGetDatum (languageoid )))
@@ -3594,7 +3595,7 @@ has_schema_privilege_name_name(PG_FUNCTION_ARGS)
35943595AclMode mode ;
35953596AclResult aclresult ;
35963597
3597- roleid = get_role_oid (NameStr (* username ), false );
3598+ roleid = get_role_oid_or_public (NameStr (* username ));
35983599schemaoid = convert_schema_name (schemaname );
35993600mode = convert_schema_priv_string (priv_type_text );
36003601
@@ -3643,7 +3644,7 @@ has_schema_privilege_name_id(PG_FUNCTION_ARGS)
36433644AclMode mode ;
36443645AclResult aclresult ;
36453646
3646- roleid = get_role_oid (NameStr (* username ), false );
3647+ roleid = get_role_oid_or_public (NameStr (* username ));
36473648mode = convert_schema_priv_string (priv_type_text );
36483649
36493650if (!SearchSysCacheExists1 (NAMESPACEOID ,ObjectIdGetDatum (schemaoid )))
@@ -3787,7 +3788,7 @@ has_server_privilege_name_name(PG_FUNCTION_ARGS)
37873788AclMode mode ;
37883789AclResult aclresult ;
37893790
3790- roleid = get_role_oid (NameStr (* username ), false );
3791+ roleid = get_role_oid_or_public (NameStr (* username ));
37913792serverid = convert_server_name (servername );
37923793mode = convert_server_priv_string (priv_type_text );
37933794
@@ -3836,7 +3837,7 @@ has_server_privilege_name_id(PG_FUNCTION_ARGS)
38363837AclMode mode ;
38373838AclResult aclresult ;
38383839
3839- roleid = get_role_oid (NameStr (* username ), false );
3840+ roleid = get_role_oid_or_public (NameStr (* username ));
38403841mode = convert_server_priv_string (priv_type_text );
38413842
38423843aclresult = pg_foreign_server_aclcheck (serverid ,roleid ,mode );
@@ -3969,7 +3970,7 @@ has_tablespace_privilege_name_name(PG_FUNCTION_ARGS)
39693970AclMode mode ;
39703971AclResult aclresult ;
39713972
3972- roleid = get_role_oid (NameStr (* username ), false );
3973+ roleid = get_role_oid_or_public (NameStr (* username ));
39733974tablespaceoid = convert_tablespace_name (tablespacename );
39743975mode = convert_tablespace_priv_string (priv_type_text );
39753976
@@ -4018,7 +4019,7 @@ has_tablespace_privilege_name_id(PG_FUNCTION_ARGS)
40184019AclMode mode ;
40194020AclResult aclresult ;
40204021
4021- roleid = get_role_oid (NameStr (* username ), false );
4022+ roleid = get_role_oid_or_public (NameStr (* username ));
40224023mode = convert_tablespace_priv_string (priv_type_text );
40234024
40244025aclresult = pg_tablespace_aclcheck (tablespaceoid ,roleid ,mode );
@@ -4821,3 +4822,16 @@ get_role_oid(const char *rolname, bool missing_ok)
48214822errmsg ("role \"%s\" does not exist" ,rolname )));
48224823return oid ;
48234824}
4825+
4826+ /*
4827+ * get_role_oid_or_public - As above, but return ACL_ID_PUBLIC if the
4828+ * role name is "public".
4829+ */
4830+ static Oid
4831+ get_role_oid_or_public (const char * rolname )
4832+ {
4833+ if (strcmp (rolname ,"public" )== 0 )
4834+ return ACL_ID_PUBLIC ;
4835+
4836+ return get_role_oid (rolname , false);
4837+ }