Bring syntax of role-related commands into SQL compliance. To avoid
authorTom Lane
Tue, 28 Jun 2005 19:51:26 +0000 (19:51 +0000)
committerTom Lane
Tue, 28 Jun 2005 19:51:26 +0000 (19:51 +0000)
syntactic conflicts, both privilege and role GRANT/REVOKE commands have
to use the same production for scanning the list of tokens that might
eventually turn out to be privileges or role names.  So, change the
existing GRANT/REVOKE code to expect a list of strings not pre-reduced
AclMode values.  Fix a couple other minor issues while at it, such as
InitializeAcl function name conflicting with a Windows system function.

src/backend/catalog/aclchk.c
src/backend/catalog/pg_proc.c
src/backend/commands/user.c
src/backend/parser/gram.y
src/backend/parser/keywords.c
src/backend/utils/adt/acl.c
src/backend/utils/init/postinit.c
src/include/nodes/parsenodes.h
src/include/storage/pmsignal.h
src/include/utils/acl.h
src/test/regress/expected/rules.out

index 6ff89eb0425b52c87eed91aa6cc7fbfb1fe781ca..f095ef24d6bf604c3cd1f3986e2faf80da88fae0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.113 2005/06/28 05:08:52 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.114 2005/06/28 19:51:21 tgl Exp $
  *
  * NOTES
  *   See acl.h.
@@ -47,6 +47,7 @@ static void ExecuteGrantStmt_Language(GrantStmt *stmt);
 static void ExecuteGrantStmt_Namespace(GrantStmt *stmt);
 static void ExecuteGrantStmt_Tablespace(GrantStmt *stmt);
 
+static AclMode string_to_privilege(const char *privname);
 static const char *privilege_to_string(AclMode privilege);
 
 
@@ -209,7 +210,7 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_RELATION;
@@ -220,7 +221,8 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_RELATION))
                ereport(ERROR,
@@ -377,7 +379,7 @@ ExecuteGrantStmt_Database(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_DATABASE;
@@ -388,7 +390,8 @@ ExecuteGrantStmt_Database(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_DATABASE))
                ereport(ERROR,
@@ -535,7 +538,7 @@ ExecuteGrantStmt_Function(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_FUNCTION;
@@ -546,7 +549,8 @@ ExecuteGrantStmt_Function(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_FUNCTION))
                ereport(ERROR,
@@ -689,7 +693,7 @@ ExecuteGrantStmt_Language(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_LANGUAGE;
@@ -700,7 +704,8 @@ ExecuteGrantStmt_Language(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_LANGUAGE))
                ereport(ERROR,
@@ -852,7 +857,7 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_NAMESPACE;
@@ -863,7 +868,8 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_NAMESPACE))
                ereport(ERROR,
@@ -1006,7 +1012,7 @@ ExecuteGrantStmt_Tablespace(GrantStmt *stmt)
    bool        all_privs;
    ListCell   *i;
 
-   if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
+   if (stmt->privileges == NIL)
    {
        all_privs = true;
        privileges = ACL_ALL_RIGHTS_TABLESPACE;
@@ -1017,7 +1023,8 @@ ExecuteGrantStmt_Tablespace(GrantStmt *stmt)
        privileges = ACL_NO_RIGHTS;
        foreach(i, stmt->privileges)
        {
-           AclMode     priv = lfirst_int(i);
+           char       *privname = strVal(lfirst(i));
+           AclMode     priv = string_to_privilege(privname);
 
            if (priv & ~((AclMode) ACL_ALL_RIGHTS_TABLESPACE))
                ereport(ERROR,
@@ -1157,6 +1164,39 @@ ExecuteGrantStmt_Tablespace(GrantStmt *stmt)
 }
 
 
+static AclMode
+string_to_privilege(const char *privname)
+{
+   if (strcmp(privname, "insert") == 0)
+       return ACL_INSERT;
+   if (strcmp(privname, "select") == 0)
+       return ACL_SELECT;
+   if (strcmp(privname, "update") == 0)
+       return ACL_UPDATE;
+   if (strcmp(privname, "delete") == 0)
+       return ACL_DELETE;
+   if (strcmp(privname, "rule") == 0)
+       return ACL_RULE;
+   if (strcmp(privname, "references") == 0)
+       return ACL_REFERENCES;
+   if (strcmp(privname, "trigger") == 0)
+       return ACL_TRIGGER;
+   if (strcmp(privname, "execute") == 0)
+       return ACL_EXECUTE;
+   if (strcmp(privname, "usage") == 0)
+       return ACL_USAGE;
+   if (strcmp(privname, "create") == 0)
+       return ACL_CREATE;
+   if (strcmp(privname, "temporary") == 0)
+       return ACL_CREATE_TEMP;
+   if (strcmp(privname, "temp") == 0)
+       return ACL_CREATE_TEMP;
+   ereport(ERROR,
+           (errcode(ERRCODE_SYNTAX_ERROR),
+            errmsg("unrecognized privilege type \"%s\"", privname)));
+   return 0;                   /* appease compiler */
+}
+
 static const char *
 privilege_to_string(AclMode privilege)
 {
index 7d1384ed382be8530fb1e9a3fa66073e1edab905..f8ed892ebfe3f02bdb1e07f5cca1b7d9cb517639 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.130 2005/06/28 05:08:52 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.131 2005/06/28 19:51:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -266,7 +266,7 @@ ProcedureCreate(const char *procedureName,
                    (errcode(ERRCODE_DUPLICATE_FUNCTION),
                     errmsg("function \"%s\" already exists with same argument types",
                            procedureName)));
-       if (GetUserId() != oldproc->proowner && !superuser())
+       if (!pg_proc_ownercheck(HeapTupleGetOid(oldtup), GetUserId()))
            aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
                           procedureName);
 
index 131f1896f928c563d39e4ddae58693eff2803799..0d34e57b258fc2225a1816aea24c115aa03711bb 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.152 2005/06/28 05:08:55 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.153 2005/06/28 19:51:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -61,16 +61,17 @@ CreateRole(CreateRoleStmt *stmt)
    bool        createrole = false;     /* Can this user create roles? */
    bool        createdb = false;       /* Can the user create databases? */
    bool        canlogin = false;       /* Can this user login? */
-   List       *roleElts = NIL;         /* roles the user is a member of */
-   List       *rolememElts = NIL;  /* roles which will be members of this role */
-   char       *validUntil = NULL;      /* The time the login is valid
-                                        * until */
+   List       *addroleto = NIL;        /* roles to make this a member of */
+   List       *rolemembers = NIL;      /* roles to be members of this role */
+   List       *adminmembers = NIL;     /* roles to be admins of this role */
+   char       *validUntil = NULL;      /* time the login is valid until */
    DefElem    *dpassword = NULL;
    DefElem    *dcreatedb = NULL;
    DefElem    *dcreaterole = NULL;
    DefElem    *dcanlogin = NULL;
-   DefElem    *droleElts = NULL;
-   DefElem    *drolememElts = NULL;
+   DefElem    *daddroleto = NULL;
+   DefElem    *drolemembers = NULL;
+   DefElem    *dadminmembers = NULL;
    DefElem    *dvalidUntil = NULL;
 
    /* Extract options from the statement node tree */
@@ -121,21 +122,29 @@ CreateRole(CreateRoleStmt *stmt)
                         errmsg("conflicting or redundant options")));
            dcanlogin = defel;
        }
-       else if (strcmp(defel->defname, "roleElts") == 0)
+       else if (strcmp(defel->defname, "addroleto") == 0)
        {
-           if (droleElts)
+           if (daddroleto)
                ereport(ERROR,
                        (errcode(ERRCODE_SYNTAX_ERROR),
                         errmsg("conflicting or redundant options")));
-           droleElts = defel;
+           daddroleto = defel;
        }
-       else if (strcmp(defel->defname, "rolememElts") == 0)
+       else if (strcmp(defel->defname, "rolemembers") == 0)
        {
-           if (drolememElts)
+           if (drolemembers)
                ereport(ERROR,
                        (errcode(ERRCODE_SYNTAX_ERROR),
                         errmsg("conflicting or redundant options")));
-           drolememElts = defel;
+           drolemembers = defel;
+       }
+       else if (strcmp(defel->defname, "adminmembers") == 0)
+       {
+           if (dadminmembers)
+               ereport(ERROR,
+                       (errcode(ERRCODE_SYNTAX_ERROR),
+                        errmsg("conflicting or redundant options")));
+           dadminmembers = defel;
        }
        else if (strcmp(defel->defname, "validUntil") == 0)
        {
@@ -164,10 +173,12 @@ CreateRole(CreateRoleStmt *stmt)
        validUntil = strVal(dvalidUntil->arg);
    if (dpassword)
        password = strVal(dpassword->arg);
-   if (droleElts)
-       roleElts = (List *) droleElts->arg;
-   if (drolememElts)
-       rolememElts = (List *) drolememElts->arg;
+   if (daddroleto)
+       addroleto = (List *) daddroleto->arg;
+   if (drolemembers)
+       rolemembers = (List *) drolemembers->arg;
+   if (dadminmembers)
+       adminmembers = (List *) dadminmembers->arg;
 
    /* Check some permissions first */
    if (!superuser())
@@ -257,7 +268,7 @@ CreateRole(CreateRoleStmt *stmt)
    /*
     * Add the new role to the specified existing roles.
     */
-   foreach(item, roleElts)
+   foreach(item, addroleto)
    {
        char   *oldrolename = strVal(lfirst(item));
        Oid     oldroleid = get_roleid_checked(oldrolename);
@@ -269,10 +280,14 @@ CreateRole(CreateRoleStmt *stmt)
    }
 
    /*
-    * Add the specified members to this new role.
+    * Add the specified members to this new role. adminmembers get the
+    * admin option, rolemembers don't.
     */
    AddRoleMems(stmt->role, roleid,
-               rolememElts, roleNamesToIds(rolememElts),
+               adminmembers, roleNamesToIds(adminmembers),
+               GetUserId(), true);
+   AddRoleMems(stmt->role, roleid,
+               rolemembers, roleNamesToIds(rolemembers),
                GetUserId(), false);
 
    /*
@@ -309,17 +324,14 @@ AlterRole(AlterRoleStmt *stmt)
    int         createrole = -1;        /* Can this user create roles? */
    int         createdb = -1;          /* Can the user create databases? */
    int         canlogin = -1;          /* Can this user login? */
-   int         adminopt = 0;   /* Can this user grant this role to others? */
-   List       *rolememElts = NIL;  /* The roles which will be added/removed to this role */
-   char       *validUntil = NULL;      /* The time the login is valid
-                                        * until */
+   List       *rolemembers = NIL;      /* roles to be added/removed */
+   char       *validUntil = NULL;      /* time the login is valid until */
    DefElem    *dpassword = NULL;
    DefElem    *dcreatedb = NULL;
    DefElem    *dcreaterole = NULL;
    DefElem    *dcanlogin = NULL;
-   DefElem    *dadminopt = NULL;
    DefElem    *dvalidUntil = NULL;
-   DefElem    *drolememElts = NULL;
+   DefElem    *drolemembers = NULL;
    Oid         roleid;
 
    /* Extract options from the statement node tree */
@@ -365,14 +377,6 @@ AlterRole(AlterRoleStmt *stmt)
                         errmsg("conflicting or redundant options")));
            dcanlogin = defel;
        }
-       else if (strcmp(defel->defname, "adminopt") == 0)
-       {
-           if (dadminopt)
-               ereport(ERROR,
-                       (errcode(ERRCODE_SYNTAX_ERROR),
-                        errmsg("conflicting or redundant options")));
-           dadminopt = defel;
-       }
        else if (strcmp(defel->defname, "validUntil") == 0)
        {
            if (dvalidUntil)
@@ -381,13 +385,14 @@ AlterRole(AlterRoleStmt *stmt)
                         errmsg("conflicting or redundant options")));
            dvalidUntil = defel;
        }
-       else if (strcmp(defel->defname, "rolememElts") == 0 && stmt->action != 0)
+       else if (strcmp(defel->defname, "rolemembers") == 0 &&
+                stmt->action != 0)
        {
-           if (drolememElts)
+           if (drolemembers)
                ereport(ERROR,
                        (errcode(ERRCODE_SYNTAX_ERROR),
                         errmsg("conflicting or redundant options")));
-           drolememElts = defel;
+           drolemembers = defel;
        }
        else
            elog(ERROR, "option \"%s\" not recognized",
@@ -404,14 +409,12 @@ AlterRole(AlterRoleStmt *stmt)
    }
    if (dcanlogin)
        canlogin = intVal(dcanlogin->arg);
-   if (dadminopt)
-       adminopt = intVal(dadminopt->arg);
    if (dvalidUntil)
        validUntil = strVal(dvalidUntil->arg);
    if (dpassword)
        password = strVal(dpassword->arg);
-   if (drolememElts)
-       rolememElts = (List *) drolememElts->arg;
+   if (drolemembers)
+       rolemembers = (List *) drolemembers->arg;
 
    /* must be superuser or just want to change your own password */
    if (!superuser() &&
@@ -420,8 +423,7 @@ AlterRole(AlterRoleStmt *stmt)
          createdb < 0 &&
          canlogin < 0 &&
          !validUntil &&
-         !rolememElts &&
-         !adminopt &&
+         !rolemembers &&
          password &&
          strcmp(GetUserNameFromId(GetUserId()), stmt->role) == 0))
        ereport(ERROR,
@@ -537,12 +539,12 @@ AlterRole(AlterRoleStmt *stmt)
 
    if (stmt->action == +1)     /* add members to role */
        AddRoleMems(stmt->role, roleid,
-                   rolememElts, roleNamesToIds(rolememElts),
-                   GetUserId(), adminopt);
+                   rolemembers, roleNamesToIds(rolemembers),
+                   GetUserId(), false);
    else if (stmt->action == -1)    /* drop members from role */
        DelRoleMems(stmt->role, roleid,
-                   rolememElts, roleNamesToIds(rolememElts),
-                   adminopt);
+                   rolemembers, roleNamesToIds(rolemembers),
+                   false);
 
    /*
     * Set flag to update flat auth file at commit.
index d822a7176a72cc9a32af4d9ac1e2cab5564a35b0..7f18b12b92b0308536bf7a2bb80958dadcf47b8b 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.499 2005/06/28 05:08:57 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.500 2005/06/28 19:51:22 tgl Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -143,10 +143,10 @@ static void doNegateFloat(Value *v);
        DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt
        DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
        DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt
-       GrantRoleStmt GrantStmt IndexStmt InsertStmt ListenStmt LoadStmt
+       GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
        LockStmt NotifyStmt ExplainableStmt PreparableStmt
        CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
-       RemoveFuncStmt RemoveOperStmt RenameStmt RevokeRoleStmt RevokeStmt
+       RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt
        RuleActionStmt RuleActionStmtOrEmpty RuleStmt
        SelectStmt TransactionStmt TruncateStmt
        UnlistenStmt UpdateStmt VacuumStmt
@@ -170,15 +170,11 @@ static void doNegateFloat(Value *v);
 
 %type    opt_lock lock_type cast_context
 %type     opt_force opt_or_replace
-               opt_grant_grant_option opt_revoke_grant_option
-               opt_alter_admin_option 
-               opt_grant_admin_option opt_revoke_admin_option
+               opt_grant_grant_option opt_grant_admin_option
                opt_nowait
 
 %type     like_including_defaults
 
-%type    role_list
-
 %type    OptRoleList
 %type  OptRoleElem
 
@@ -205,7 +201,7 @@ static void doNegateFloat(Value *v);
 %type         iso_level opt_encoding
 %type    grantee
 %type    grantee_list
-%type <ival>   privilege
+%type <str>        privilege
 %type    privileges privilege_list
 %type  privilege_target
 %type  function_with_argtypes
@@ -347,8 +343,8 @@ static void doNegateFloat(Value *v);
    CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
    CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
    COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
-   CREATEROLE CREATEUSER CROSS CSV CURRENT_DATE CURRENT_TIME
-   CURRENT_TIMESTAMP CURRENT_ROLE CURRENT_USER CURSOR CYCLE
+   CREATEROLE CREATEUSER CROSS CSV CURRENT_DATE CURRENT_ROLE CURRENT_TIME
+   CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
 
    DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
    DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
@@ -375,13 +371,13 @@ static void doNegateFloat(Value *v);
 
    LANCOMPILER LANGUAGE LARGE_P  LAST_P LEADING LEAST LEFT LEVEL
    LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
-   LOCK_P LOGIN
+   LOCK_P LOGIN_P
 
    MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
 
    NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
-   NOCREATEROLE NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P
-   NULLIF NUMERIC NOLOGIN
+   NOCREATEROLE NOCREATEUSER NOLOGIN_P NONE NOT NOTHING NOTIFY
+   NOTNULL NOWAIT NULL_P NULLIF NUMERIC
 
    OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
    ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
@@ -397,7 +393,7 @@ static void doNegateFloat(Value *v);
    ROLE ROLLBACK ROW ROWS RULE
 
    SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
-   SERIALIZABLE SESSION SESSION_ROLE SESSION_USER SET SETOF SHARE
+   SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
    SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
    STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYMMETRIC
    SYSID SYSTEM_P
@@ -407,7 +403,7 @@ static void doNegateFloat(Value *v);
    TRUNCATE TRUSTED TYPE_P
 
    UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
-   UPDATE USAGE USER USING
+   UPDATE USER USING
 
    VACUUM VALID VALIDATOR VALUES VARCHAR VARYING
    VERBOSE VIEW VOLATILE
@@ -544,8 +540,8 @@ stmt :
            | ExecuteStmt
            | ExplainStmt
            | FetchStmt
-           | GrantRoleStmt
            | GrantStmt
+           | GrantRoleStmt
            | IndexStmt
            | InsertStmt
            | ListenStmt
@@ -558,8 +554,8 @@ stmt :
            | RemoveFuncStmt
            | RemoveOperStmt
            | RenameStmt
-           | RevokeRoleStmt
            | RevokeStmt
+           | RevokeRoleStmt
            | RuleStmt
            | SelectStmt
            | TransactionStmt
@@ -579,7 +575,6 @@ stmt :
  *
  * Create a new Postgres DBMS role
  *
- *
  *****************************************************************************/
 
 CreateRoleStmt:
@@ -597,11 +592,99 @@ opt_with: WITH                                    {}
            | /*EMPTY*/                             {}
        ;
 
+/*
+ * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
+ * for backwards compatibility).  Note: the only option required by SQL99
+ * is "WITH ADMIN name".
+ */
+OptRoleList:
+           OptRoleList OptRoleElem                 { $$ = lappend($1, $2); }
+           | /* EMPTY */                           { $$ = NIL; }
+       ;
+
+OptRoleElem:
+           PASSWORD Sconst
+               {
+                   $$ = makeDefElem("password",
+                                    (Node *)makeString($2));
+               }
+           | ENCRYPTED PASSWORD Sconst
+               {
+                   $$ = makeDefElem("encryptedPassword",
+                                    (Node *)makeString($3));
+               }
+           | UNENCRYPTED PASSWORD Sconst
+               {
+                   $$ = makeDefElem("unencryptedPassword",
+                                    (Node *)makeString($3));
+               }
+           | SYSID Iconst
+               {
+                   $$ = makeDefElem("sysid", (Node *)makeInteger($2));
+               }
+           | CREATEDB
+               {
+                   $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
+               }
+           | NOCREATEDB
+               {
+                   $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
+               }
+           | CREATEROLE
+               {
+                   $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
+               }
+           | CREATEUSER
+               {
+                   $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
+               }
+           | LOGIN_P
+               {
+                   $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
+               }
+           | NOCREATEROLE
+               {
+                   $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
+               }
+           | NOCREATEUSER
+               {
+                   $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
+               }
+           | NOLOGIN_P
+               {
+                   $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
+               }
+           | IN_P ROLE name_list
+               {
+                   $$ = makeDefElem("addroleto", (Node *)$3);
+               }
+           | IN_P GROUP_P name_list
+               {
+                   $$ = makeDefElem("addroleto", (Node *)$3);
+               }
+           | VALID UNTIL Sconst
+               {
+                   $$ = makeDefElem("validUntil", (Node *)makeString($3));
+               }
+           | ADMIN name_list
+               {
+                   $$ = makeDefElem("adminmembers", (Node *)$2);
+               }
+           | ROLE name_list
+               {
+                   $$ = makeDefElem("rolemembers", (Node *)$2);
+               }
+           | USER name_list
+               {
+                   $$ = makeDefElem("rolemembers", (Node *)$2);
+               }
+       ;
+
+
 /*****************************************************************************
  *
  * Create a new Postgres DBMS user (role with implied login ability)
  *
- *
  *****************************************************************************/
 
 CreateUserStmt:
@@ -609,8 +692,9 @@ CreateUserStmt:
                {
                    CreateRoleStmt *n = makeNode(CreateRoleStmt);
                    n->role = $3;
-                   n->options = $5;
-                   n->options = lappend(n->options,makeDefElem("canlogin", (Node *)makeInteger(TRUE)));
+                   n->options = lappend($5,
+                                        makeDefElem("canlogin",
+                                                    (Node *)makeInteger(TRUE)));
                    $$ = (Node *)n;
                }
        ;
@@ -620,7 +704,6 @@ CreateUserStmt:
  *
  * Alter a postgresql DBMS role
  *
- *
  *****************************************************************************/
 
 AlterRoleStmt:
@@ -631,24 +714,6 @@ AlterRoleStmt:
                    n->options = $5;
                    $$ = (Node *)n;
                 }
-           | ALTER ROLE RoleId add_drop ROLE role_list opt_alter_admin_option
-               {
-                   AlterRoleStmt *n = makeNode(AlterRoleStmt);
-                   n->role = $3;
-                   n->action = $4;
-                   n->options = lappend(n->options,makeDefElem("rolememElts", (Node *)$6));
-                   n->options = lappend(n->options,makeDefElem("adminopt", (Node *)makeInteger($7)));
-                   $$ = (Node *)n;
-               }
-       ;
-
-add_drop:  ADD                                     { $$ = +1; }
-           | DROP                                  { $$ = -1; }
-       ;
-
-opt_alter_admin_option:
-           ADMIN OPTION { $$ = TRUE; }
-           | /*EMPTY*/ { $$ = FALSE; }
        ;
 
 AlterRoleSetStmt:
@@ -668,14 +733,13 @@ AlterRoleSetStmt:
                    n->value = NIL;
                    $$ = (Node *)n;
                }
-           ;
+       ;
 
 
 /*****************************************************************************
  *
  * Alter a postgresql DBMS user
  *
- *
  *****************************************************************************/
 
 AlterUserStmt:
@@ -719,7 +783,7 @@ AlterUserSetStmt:
  *****************************************************************************/
 
 DropRoleStmt:
-           DROP ROLE role_list
+           DROP ROLE name_list
                {
                    DropRoleStmt *n = makeNode(DropRoleStmt);
                    n->roles = $3;
@@ -737,7 +801,7 @@ DropRoleStmt:
  *****************************************************************************/
 
 DropUserStmt:
-           DROP USER role_list
+           DROP USER name_list
                {
                    DropRoleStmt *n = makeNode(DropRoleStmt);
                    n->roles = $3;
@@ -745,96 +809,11 @@ DropUserStmt:
                }
            ;
 
-/*
- * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER for backwards compat)
- */
-OptRoleList:
-           OptRoleList OptRoleElem                 { $$ = lappend($1, $2); }
-           | /* EMPTY */                           { $$ = NIL; }
-       ;
-
-OptRoleElem:
-           PASSWORD Sconst
-               {
-                   $$ = makeDefElem("password", (Node *)makeString($2));
-               }
-           | ENCRYPTED PASSWORD Sconst
-               {
-                   $$ = makeDefElem("encryptedPassword", (Node *)makeString($3));
-               }
-           | UNENCRYPTED PASSWORD Sconst
-               {
-                   $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3));
-               }
-           | SYSID Iconst
-               {
-                   $$ = makeDefElem("sysid", (Node *)makeInteger($2));
-               }
-           | CREATEDB
-               {
-                   $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
-               }
-           | NOCREATEDB
-               {
-                   $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
-               }
-           | CREATEROLE
-               {
-                   $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
-               }
-           | CREATEUSER
-               {
-                   $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
-               }
-           | LOGIN
-               {
-                   $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
-               }
-           | NOCREATEROLE
-               {
-                   $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
-               }
-           | NOCREATEUSER
-               {
-                   $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
-               }
-           | NOLOGIN
-               {
-                   $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
-               }
-           | IN_P ROLE role_list
-               {
-                   $$ = makeDefElem("roleElts", (Node *)$3);
-               }
-           | IN_P GROUP_P role_list
-               {
-                   $$ = makeDefElem("roleElts", (Node *)$3);
-               }
-           | VALID UNTIL Sconst
-               {
-                   $$ = makeDefElem("validUntil", (Node *)makeString($3));
-               }
-           | ROLE role_list
-               {
-                   $$ = makeDefElem("rolememElts", (Node *)$2);
-               }
-           | USER role_list
-               {
-                   $$ = makeDefElem("rolememElts", (Node *)$2);
-               }
-       ;
-
-role_list: role_list ',' RoleId        { $$ = lappend($1, makeString($3)); }
-           | RoleId                    { $$ = list_make1(makeString($1)); }
-       ;
-
-
 
 /*****************************************************************************
  *
  * Create a postgresql group (role without login ability)
  *
- *
  *****************************************************************************/
 
 CreateGroupStmt:
@@ -852,20 +831,24 @@ CreateGroupStmt:
  *
  * Alter a postgresql group
  *
- *
  *****************************************************************************/
 
 AlterGroupStmt:
-           ALTER GROUP_P RoleId add_drop USER role_list
+           ALTER GROUP_P RoleId add_drop USER name_list
                {
                    AlterRoleStmt *n = makeNode(AlterRoleStmt);
                    n->role = $3;
                    n->action = $4;
-                   n->options = lappend(n->options,makeDefElem("rolememElts", (Node *)$6));
+                   n->options = list_make1(makeDefElem("rolemembers",
+                                                       (Node *)$6));
                    $$ = (Node *)n;
                }
        ;
 
+add_drop:  ADD                                     { $$ = +1; }
+           | DROP                                  { $$ = -1; }
+       ;
+
 
 /*****************************************************************************
  *
@@ -875,7 +858,7 @@ AlterGroupStmt:
  *****************************************************************************/
 
 DropGroupStmt:
-           DROP GROUP_P role_list
+           DROP GROUP_P name_list
                {
                    DropRoleStmt *n = makeNode(DropRoleStmt);
                    n->roles = $3;
@@ -3116,36 +3099,6 @@ from_in: FROM                                    {}
        ;
 
 
-/*****************************************************************************
- *
- * GRANT and REVOKE ROLE statements
- *
- *****************************************************************************/
-
-GrantRoleStmt: GRANT ROLE role_list TO role_list opt_grant_admin_option
-           opt_granted_by
-               {
-                   GrantRoleStmt *n = makeNode(GrantRoleStmt);
-                   n->granted_roles = $3;
-                   n->grantee_roles = $5;
-                   n->is_grant = true;
-                   n->admin_opt = $6;
-                   n->grantor = $7;
-                   $$ = (Node*)n;
-               }
-
-RevokeRoleStmt:    REVOKE ROLE opt_revoke_admin_option role_list FROM role_list
-           opt_drop_behavior
-               {
-                   GrantRoleStmt *n = makeNode(GrantRoleStmt);
-                   n->granted_roles = $4;
-                   n->grantee_roles = $6;
-                   n->is_grant = false;
-                   n->admin_opt = $3;
-                   n->behavior = $7;
-                   $$ = (Node*)n;
-               }
-
 /*****************************************************************************
  *
  * GRANT and REVOKE statements
@@ -3166,54 +3119,70 @@ GrantStmt:  GRANT privileges ON privilege_target TO grantee_list
                }
        ;
 
-RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target
+RevokeStmt:
+           REVOKE privileges ON privilege_target
            FROM grantee_list opt_drop_behavior
                {
                    GrantStmt *n = makeNode(GrantStmt);
                    n->is_grant = false;
-                   n->privileges = $3;
-                   n->objtype = ($5)->objtype;
-                   n->objects = ($5)->objs;
-                   n->grantees = $7;
-                   n->grant_option = $2;
-                   n->behavior = $8;
-
+                   n->grant_option = false;
+                   n->privileges = $2;
+                   n->objtype = ($4)->objtype;
+                   n->objects = ($4)->objs;
+                   n->grantees = $6;
+                   n->behavior = $7;
+                   $$ = (Node *)n;
+               }
+           | REVOKE GRANT OPTION FOR privileges ON privilege_target
+           FROM grantee_list opt_drop_behavior
+               {
+                   GrantStmt *n = makeNode(GrantStmt);
+                   n->is_grant = false;
+                   n->grant_option = true;
+                   n->privileges = $5;
+                   n->objtype = ($7)->objtype;
+                   n->objects = ($7)->objs;
+                   n->grantees = $9;
+                   n->behavior = $10;
                    $$ = (Node *)n;
                }
        ;
 
 
+/*
+ * A privilege list is represented as a list of strings; the validity of
+ * the privilege names gets checked at execution.  This is a bit annoying
+ * but we have little choice because of the syntactic conflict with lists
+ * of role names in GRANT/REVOKE.  What's more, we have to call out in
+ * the "privilege" production any reserved keywords that need to be usable
+ * as privilege names.
+ */
+
 /* either ALL [PRIVILEGES] or a list of individual privileges */
-privileges: privilege_list             { $$ = $1; }
-           | ALL                       { $$ = list_make1_int(ACL_ALL_RIGHTS); }
-           | ALL PRIVILEGES            { $$ = list_make1_int(ACL_ALL_RIGHTS); }
+privileges: privilege_list
+               { $$ = $1; }
+           | ALL
+               { $$ = NIL; }
+           | ALL PRIVILEGES
+               { $$ = NIL; }
        ;
 
-privilege_list:
-           privilege                               { $$ = list_make1_int($1); }
-           | privilege_list ',' privilege          { $$ = lappend_int($1, $3); }
+privilege_list:    privilege
+                   { $$ = list_make1(makeString($1)); }
+           | privilege_list ',' privilege
+                   { $$ = lappend($1, makeString($3)); }
        ;
 
-/* Not all of these privilege types apply to all objects, but that
- * gets sorted out later.
- */
-privilege: SELECT                                  { $$ = ACL_SELECT; }
-           | INSERT                                { $$ = ACL_INSERT; }
-           | UPDATE                                { $$ = ACL_UPDATE; }
-           | DELETE_P                              { $$ = ACL_DELETE; }
-           | RULE                                  { $$ = ACL_RULE; }
-           | REFERENCES                            { $$ = ACL_REFERENCES; }
-           | TRIGGER                               { $$ = ACL_TRIGGER; }
-           | EXECUTE                               { $$ = ACL_EXECUTE; }
-           | USAGE                                 { $$ = ACL_USAGE; }
-           | CREATE                                { $$ = ACL_CREATE; }
-           | TEMPORARY                             { $$ = ACL_CREATE_TEMP; }
-           | TEMP                                  { $$ = ACL_CREATE_TEMP; }
+privilege: SELECT                                  { $$ = pstrdup($1); }
+           | REFERENCES                            { $$ = pstrdup($1); }
+           | CREATE                                { $$ = pstrdup($1); }
+           | ColId                                 { $$ = $1; }
        ;
 
 
 /* Don't bother trying to fold the first two rules into one using
-   opt_table.  You're going to get conflicts. */
+ * opt_table.  You're going to get conflicts.
+ */
 privilege_target:
            qualified_name_list
                {
@@ -3300,27 +3269,6 @@ opt_grant_grant_option:
            | /*EMPTY*/ { $$ = FALSE; }
        ;
 
-opt_grant_admin_option:
-           WITH ADMIN OPTION { $$ = TRUE; }
-           | /*EMPTY*/ { $$ = FALSE; }
-       ;
-
-opt_granted_by:
-           GRANTED BY RoleId { $$ = $3; }
-           | /*EMPTY*/ { $$ = NULL; }
-       ;
-
-opt_revoke_grant_option:
-           GRANT OPTION FOR { $$ = TRUE; }
-           | /*EMPTY*/ { $$ = FALSE; }
-       ;
-
-opt_revoke_admin_option:
-           ADMIN OPTION FOR { $$ = TRUE; }
-           | /*EMPTY*/ { $$ = FALSE; }
-       ;
-
-
 function_with_argtypes_list:
            function_with_argtypes                  { $$ = list_make1($1); }
            | function_with_argtypes_list ',' function_with_argtypes
@@ -3337,6 +3285,56 @@ function_with_argtypes:
                }
        ;
 
+/*****************************************************************************
+ *
+ * GRANT and REVOKE ROLE statements
+ *
+ *****************************************************************************/
+
+GrantRoleStmt:
+           GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
+               {
+                   GrantRoleStmt *n = makeNode(GrantRoleStmt);
+                   n->is_grant = true;
+                   n->granted_roles = $2;
+                   n->grantee_roles = $4;
+                   n->admin_opt = $5;
+                   n->grantor = $6;
+                   $$ = (Node*)n;
+               }
+       ;
+
+RevokeRoleStmt:
+           REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
+               {
+                   GrantRoleStmt *n = makeNode(GrantRoleStmt);
+                   n->is_grant = false;
+                   n->admin_opt = false;
+                   n->granted_roles = $2;
+                   n->grantee_roles = $4;
+                   n->behavior = $6;
+                   $$ = (Node*)n;
+               }
+           | REVOKE ADMIN OPTION FOR privilege_list FROM name_list opt_granted_by opt_drop_behavior
+               {
+                   GrantRoleStmt *n = makeNode(GrantRoleStmt);
+                   n->is_grant = false;
+                   n->admin_opt = true;
+                   n->granted_roles = $5;
+                   n->grantee_roles = $7;
+                   n->behavior = $9;
+                   $$ = (Node*)n;
+               }
+       ;
+
+opt_grant_admin_option: WITH ADMIN OPTION              { $$ = TRUE; }
+           | /*EMPTY*/                                 { $$ = FALSE; }
+       ;
+
+opt_granted_by: GRANTED BY RoleId                      { $$ = $3; }
+           | /*EMPTY*/                                 { $$ = NULL; }
+       ;
+
 
 /*****************************************************************************
  *
@@ -7066,24 +7064,6 @@ func_expr:   func_name '(' ')'
                    n->agg_distinct = FALSE;
                    $$ = (Node *)n;
                }
-           | SESSION_ROLE
-               {
-                   FuncCall *n = makeNode(FuncCall);
-                   n->funcname = SystemFuncName("session_user");
-                   n->args = NIL;
-                   n->agg_star = FALSE;
-                   n->agg_distinct = FALSE;
-                   $$ = (Node *)n;
-               }
-           | ROLE
-               {
-                   FuncCall *n = makeNode(FuncCall);
-                   n->funcname = SystemFuncName("current_user");
-                   n->args = NIL;
-                   n->agg_star = FALSE;
-                   n->agg_distinct = FALSE;
-                   $$ = (Node *)n;
-               }
            | CURRENT_USER
                {
                    FuncCall *n = makeNode(FuncCall);
@@ -7928,6 +7908,7 @@ unreserved_keyword:
            | ACCESS
            | ACTION
            | ADD
+           | ADMIN
            | AFTER
            | AGGREGATE
            | ALSO
@@ -7988,6 +7969,7 @@ unreserved_keyword:
            | FORWARD
            | FUNCTION
            | GLOBAL
+           | GRANTED
            | HANDLER
            | HEADER
            | HOLD
@@ -8016,7 +7998,7 @@ unreserved_keyword:
            | LOCAL
            | LOCATION
            | LOCK_P
-           | LOGIN
+           | LOGIN_P
            | MATCH
            | MAXVALUE
            | MINUTE_P
@@ -8030,7 +8012,7 @@ unreserved_keyword:
            | NOCREATEDB
            | NOCREATEROLE
            | NOCREATEUSER
-           | NOLOGIN
+           | NOLOGIN_P
            | NOTHING
            | NOTIFY
            | NOWAIT
@@ -8063,6 +8045,7 @@ unreserved_keyword:
            | RESTRICT
            | RETURNS
            | REVOKE
+           | ROLE
            | ROLLBACK
            | ROWS
            | RULE
@@ -8104,7 +8087,6 @@ unreserved_keyword:
            | UNLISTEN
            | UNTIL
            | UPDATE
-           | USAGE
            | VACUUM
            | VALID
            | VALIDATOR
@@ -8228,9 +8210,9 @@ reserved_keyword:
            | CONSTRAINT
            | CREATE
            | CURRENT_DATE
+           | CURRENT_ROLE
            | CURRENT_TIME
            | CURRENT_TIMESTAMP
-           | CURRENT_ROLE
            | CURRENT_USER
            | DEFAULT
            | DEFERRABLE
@@ -8269,7 +8251,6 @@ reserved_keyword:
            | PRIMARY
            | REFERENCES
            | SELECT
-           | SESSION_ROLE
            | SESSION_USER
            | SOME
            | SYMMETRIC
@@ -8280,7 +8261,6 @@ reserved_keyword:
            | TRUE_P
            | UNION
            | UNIQUE
-           | ROLE
            | USER
            | USING
            | WHEN
index a11d4affc1df3ea385f0e476d6d8b06353589d6a..6fcb97675f629f98c40c791c83811b190cee07d3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.160 2005/06/28 05:08:58 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.161 2005/06/28 19:51:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,6 +35,7 @@ static const ScanKeyword ScanKeywords[] = {
    {"access", ACCESS},
    {"action", ACTION},
    {"add", ADD},
+   {"admin", ADMIN},
    {"after", AFTER},
    {"aggregate", AGGREGATE},
    {"all", ALL},
@@ -89,10 +90,12 @@ static const ScanKeyword ScanKeywords[] = {
    {"copy", COPY},
    {"create", CREATE},
    {"createdb", CREATEDB},
+   {"createrole", CREATEROLE},
    {"createuser", CREATEUSER},
    {"cross", CROSS},
    {"csv", CSV},
    {"current_date", CURRENT_DATE},
+   {"current_role", CURRENT_ROLE},
    {"current_time", CURRENT_TIME},
    {"current_timestamp", CURRENT_TIMESTAMP},
    {"current_user", CURRENT_USER},
@@ -146,6 +149,7 @@ static const ScanKeyword ScanKeywords[] = {
    {"function", FUNCTION},
    {"global", GLOBAL},
    {"grant", GRANT},
+   {"granted", GRANTED},
    {"greatest", GREATEST},
    {"group", GROUP_P},
    {"handler", HANDLER},
@@ -197,6 +201,7 @@ static const ScanKeyword ScanKeywords[] = {
    {"localtimestamp", LOCALTIMESTAMP},
    {"location", LOCATION},
    {"lock", LOCK_P},
+   {"login", LOGIN_P},
    {"match", MATCH},
    {"maxvalue", MAXVALUE},
    {"minute", MINUTE_P},
@@ -212,7 +217,9 @@ static const ScanKeyword ScanKeywords[] = {
    {"next", NEXT},
    {"no", NO},
    {"nocreatedb", NOCREATEDB},
+   {"nocreaterole", NOCREATEROLE},
    {"nocreateuser", NOCREATEUSER},
+   {"nologin", NOLOGIN_P},
    {"none", NONE},
    {"not", NOT},
    {"nothing", NOTHING},
@@ -331,7 +338,6 @@ static const ScanKeyword ScanKeywords[] = {
    {"unlisten", UNLISTEN},
    {"until", UNTIL},
    {"update", UPDATE},
-   {"usage", USAGE},
    {"user", USER},
    {"using", USING},
    {"vacuum", VACUUM},
index 4d5904b76901dc4526a9d88feff36291ad1a7f63..2fe7fd39bcac787135d3c34fc7fefc620d890039 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.115 2005/06/28 05:09:00 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.116 2005/06/28 19:51:23 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2414,7 +2414,7 @@ convert_tablespace_priv_string(text *priv_type_text)
 }
 
 void
-InitializeAcl(void)
+initialize_acl(void)
 {
    if (!IsBootstrapProcessingMode())
    {
index 9baacacfffd9400341ead1dbb5869bcab58f23c5..21b0650e8278458a6cf457b4c6643a4359d4c937 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.150 2005/06/28 05:09:02 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.151 2005/06/28 19:51:23 tgl Exp $
  *
  *
  *-------------------------------------------------------------------------
@@ -471,7 +471,7 @@ InitPostgres(const char *dbname, const char *username)
    InitializeSearchPath();
 
    /* set up ACL framework (currently just sets RolMemCache callback) */
-   InitializeAcl();
+   initialize_acl();
 
    /* initialize client encoding */
    InitializeClientEncoding();
index 64acaa72e57f5e169a7a0bcd395637c2dc649f82..32f9b03c585a243dd43651389f3ef86bc8299d3f 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.284 2005/06/28 05:09:13 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.285 2005/06/28 19:51:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -29,7 +29,7 @@ typedef enum QuerySource
 
 /*
  * Grantable rights are encoded so that we can OR them together in a bitmask.
- * The present representation of AclItem limits us to 15 distinct rights,
+ * The present representation of AclItem limits us to 16 distinct rights,
  * even though AclMode is defined as uint32.  See utils/acl.h.
  *
  * Caution: changing these codes breaks stored ACLs, hence forces initdb.
@@ -48,7 +48,6 @@ typedef uint32 AclMode;           /* a bitmask of privilege bits */
 #define ACL_CREATE     (1<<9)  /* for namespaces and databases */
 #define ACL_CREATE_TEMP (1<<10) /* for databases */
 #define N_ACL_RIGHTS   11      /* 1 plus the last 1<
-#define ACL_ALL_RIGHTS (-1)    /* all-privileges marker in GRANT list */
 #define ACL_NO_RIGHTS  0
 /* Currently, SELECT ... FOR UPDATE/FOR SHARE requires UPDATE privileges */
 #define ACL_SELECT_FOR_UPDATE  ACL_UPDATE
@@ -886,7 +885,8 @@ typedef struct GrantStmt
    List       *objects;        /* list of RangeVar nodes, FuncWithArgs
                                 * nodes, or plain names (as Value
                                 * strings) */
-   List       *privileges;     /* integer list of privilege codes */
+   List       *privileges;     /* list of privilege names (as Strings) */
+   /* privileges == NIL denotes "all privileges" */
    List       *grantees;       /* list of PrivGrantee nodes */
    bool        grant_option;   /* grant or revoke grant option */
    DropBehavior behavior;      /* drop behavior (for REVOKE) */
index f82630ae2421c6960e7facad7b558c7294da8c39..d7956d94105153ac02ce6a53a76f5d1253b6955c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/pmsignal.h,v 1.11 2004/12/31 22:03:42 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/storage/pmsignal.h,v 1.12 2005/06/28 19:51:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,7 +22,7 @@
  */
 typedef enum
 {
-   PMSIGNAL_PASSWORD_CHANGE,   /* pg_pwd file has changed */
+   PMSIGNAL_PASSWORD_CHANGE,   /* pg_auth file has changed */
    PMSIGNAL_WAKEN_CHILDREN,    /* send a SIGUSR1 signal to all backends */
    PMSIGNAL_WAKEN_ARCHIVER,    /* send a NOTIFY signal to xlog archiver */
 
index f055ac93aa30c64650232c1777affda4676e1af1..82e004794bcfd380bad4a9f66fa5b316580d932b 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/acl.h,v 1.78 2005/06/28 05:09:13 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/utils/acl.h,v 1.79 2005/06/28 19:51:25 tgl Exp $
  *
  * NOTES
  *   An ACL array is simply an array of AclItems, representing the union
@@ -211,7 +211,7 @@ extern AclMode aclmask(const Acl *acl, Oid roleid, Oid ownerId,
 
 extern bool is_member_of_role(Oid member, Oid role);
 
-extern void InitializeAcl(void);
+extern void initialize_acl(void);
 
 /*
  * SQL functions (from acl.c)
index 47fc262c31569a4bc8898ac3f3e27ea10ba67ce4..41cc113b6dd7006584a752fc87fa9fa806899cd4 100644 (file)
@@ -1279,7 +1279,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
  iexit                    | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
  pg_group                 | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY(SELECT pg_auth_members.member FROM pg_auth_members WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist FROM pg_authid WHERE (NOT pg_authid.rolcanlogin);
  pg_indexes               | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS "tablespace", pg_get_indexdef(i.oid) AS indexdef FROM ((((pg_index x JOIN pg_class c ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
- pg_locks                 | SELECT l.locktype, l."database", l.relation, l.page, l.tuple, l.transactionid, l.classid, l.objid, l.objsubid, l."transaction", l.pid, l."mode", l.granted FROM pg_lock_status() l(locktype text, "database" oid, relation oid, page integer, tuple smallint, transactionid xid, classid oid, objid oid, objsubid smallint, "transaction" xid, pid integer, "mode" text, granted boolean);
+ pg_locks                 | SELECT l.locktype, l."database", l.relation, l.page, l.tuple, l.transactionid, l.classid, l.objid, l.objsubid, l."transaction", l.pid, l."mode", l."granted" FROM pg_lock_status() l(locktype text, "database" oid, relation oid, page integer, tuple smallint, transactionid xid, classid oid, objid oid, objsubid smallint, "transaction" xid, pid integer, "mode" text, "granted" boolean);
  pg_prepared_xacts        | SELECT p."transaction", p.gid, p."prepared", u.rolname AS "owner", d.datname AS "database" FROM ((pg_prepared_xact() p("transaction" xid, gid text, "prepared" timestamp with time zone, ownerid oid, dbid oid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
  pg_roles                 | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, '********'::text AS rolpassword, pg_authid.rolvaliduntil, pg_authid.rolconfig FROM pg_authid;
  pg_rules                 | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);