Has anyone else taken a look at this?  I thought I'd play around with the
system catalog and see if I couldn't put an ACL column into pg_attribute:

It ended up generating the following BKI line:

        insert ( 1249 attacl 1034 -1 -1 18 1 -1 -1 f x i f f f t 0 _null_ )

And the ROW certainly appears to be in pg_attribute:

        template1=# select * from pg_attribute where attrelid=1249 and 
attnum=18;
        -[ RECORD 1 ]-+-------
        attrelid      | 1249
        attname       | attacl
        atttypid      | 1034
        attstattarget | -1
        attlen        | -1
        attnum        | 18
        attndims      | 1
        attcacheoff   | -1
        atttypmod     | -1
        attbyval      | f
        attstorage    | x
        attalign      | i
        attnotnull    | f
        atthasdef     | f
        attisdropped  | f
        attislocal    | t
        attinhcount   | 0

        ^^^^ no attacl column though!

However, the COLUMN doesn't appear to the parser:

        [EMAIL PROTECTED]/test=# select attacl from pg_attribute;
        ERROR:  column "attacl" does not exist

-----------------------------------------------------------------

For better or worse, I tried the idea from pg_class where the attacl[]
comes at the end of the CATALOG(pg_attribute):

*** include/catalog/pg_attribute.h      15 Oct 2005 02:49:42 -0000      1.119
--- include/catalog/pg_attribute.h      13 Jan 2006 09:29:06 -0000
***************
*** 37,44 ****
--- 37,50 ----
   *
   *            If you change the following, make sure you change the structs 
for
   *            system attributes in catalog/heap.c also.
   * ----------------
+  *            This structure is actually variable-length (the last attribute 
is
+  *            a POSTGRES array).      Hence, sizeof(FormData_pg_attribute) 
does not
+  *            necessarily match the actual length of the structure.  
Furthermore
+  *            attacl may be a NULL field.  Hence, you MUST use heap_getattr()
+  *            to get the attacl field ... and don't forget to check isNull.
+  * ----------------
   */
  #define AttributeRelationId  1249
  
  CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS
***************
*** 148,161 ****
--- 154,174 ----
        bool            attislocal;
  
        /* Number of times inherited from direct parent relation(s) */
        int4            attinhcount;
+ 
+       /*
+        * attacl may or may not be present, see note above!
+        */
+       aclitem         attacl[1];              /* we declare this just for the 
catalog */
+ 
  } FormData_pg_attribute;
  
  /*
   * someone should figure out how to do this properly. (The problem is
   * the size of the C struct is not the same as the size of the tuple
   * because of alignment padding at the end of the struct.)
+  * This includes only the fixed part of the tuple (not the attacl).
   */
  #define ATTRIBUTE_TUPLE_SIZE \
        (offsetof(FormData_pg_attribute,attinhcount) + sizeof(int4))


-----------------------------------------------------------------

What is causing the parser not to be able to see that attacl is a valid
column?  Have I missed something in the relcache?  Or is the pg_class hack
(with its relacl[] on the end of the struct) truly not going to work with
pg_attribute?

Ideas?

-- 
 kevin brintnall =~ <[EMAIL PROTECTED]>

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to