Josh Berkus wrote:
> Folks,
> 
> Just got tripped up by this:
> 
> GRANT SELECT ON table1 TO someuser;
> GRANT SELECT ON table1_id_seq TO someuser;
> .... both work
> 
> However,
> GRANT SELECT ON TABLE table1 TO someuser; 
> ... works, while ....
> GRANT SELECT ON SEQUENCE table1_id_seq TO someuser;
> ... raises an error.
> 
> This is inconsistent.   Do people agree with me that the parser should 
> accept "SEQUENCE" there, since the optional object name works for all 
> other objects?  Is there some technical reason this is difficult to do?

The following patch allows VIEW and SEQUENCE for GRANT.  I didn't add
checks for relkind, figuring it wasn't worth it, right?

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/ref/grant.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/grant.sgml,v
retrieving revision 1.50
diff -c -c -r1.50 grant.sgml
*** doc/src/sgml/ref/grant.sgml 20 Oct 2005 19:18:01 -0000      1.50
--- doc/src/sgml/ref/grant.sgml 5 Jan 2006 18:18:37 -0000
***************
*** 22,28 ****
  <synopsis>
  GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
      [,...] | ALL [ PRIVILEGES ] }
!     ON [ TABLE ] <replaceable class="PARAMETER">tablename</replaceable> [, 
...]
      TO { <replaceable class="PARAMETER">username</replaceable> | GROUP 
<replaceable class="PARAMETER">groupname</replaceable> | PUBLIC } [, ...] [ 
WITH GRANT OPTION ]
  
  GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
--- 22,28 ----
  <synopsis>
  GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
      [,...] | ALL [ PRIVILEGES ] }
!     ON [ TABLE | VIEW | SEQUENCE ] <replaceable 
class="PARAMETER">tablename</replaceable> [, ...]
      TO { <replaceable class="PARAMETER">username</replaceable> | GROUP 
<replaceable class="PARAMETER">groupname</replaceable> | PUBLIC } [, ...] [ 
WITH GRANT OPTION ]
  
  GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
Index: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.521
diff -c -c -r2.521 gram.y
*** src/backend/parser/gram.y   29 Dec 2005 04:53:18 -0000      2.521
--- src/backend/parser/gram.y   5 Jan 2006 18:18:41 -0000
***************
*** 3315,3320 ****
--- 3315,3321 ----
                                        n->objs = $1;
                                        $$ = n;
                                }
+                       /* The next three are processed identically. */
                        | TABLE qualified_name_list
                                {
                                        PrivTarget *n = makeNode(PrivTarget);
***************
*** 3322,3327 ****
--- 3323,3342 ----
                                        n->objs = $2;
                                        $$ = n;
                                }
+                       | VIEW qualified_name_list
+                               {
+                                       PrivTarget *n = makeNode(PrivTarget);
+                                       n->objtype = ACL_OBJECT_RELATION;
+                                       n->objs = $2;
+                                       $$ = n;
+                               }
+                       | SEQUENCE qualified_name_list
+                               {
+                                       PrivTarget *n = makeNode(PrivTarget);
+                                       n->objtype = ACL_OBJECT_RELATION;
+                                       n->objs = $2;
+                                       $$ = n;
+                               }
                        | FUNCTION function_with_argtypes_list
                                {
                                        PrivTarget *n = makeNode(PrivTarget);
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to