From 0a17fd726ca50d04d99395addbbc89e6dfa5be31 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 26 Apr 2004 15:06:49 +0000
Subject: [PATCH] Please find a attached a small patch that adds accessor
 functions for "aclitem" so that it is not an opaque datatype.

I needed these functions to browse aclitems from user land. I can load
them when necessary, but it seems to me that these accessors for a
backend type belong to the backend, so I submit them.

Fabien Coelho
---
 src/backend/utils/adt/acl.c              | 39 +++++++++++++++++++++++-
 src/include/catalog/catversion.h         |  4 +--
 src/include/catalog/pg_proc.h            | 14 ++++++++-
 src/include/utils/acl.h                  |  7 ++++-
 src/test/regress/expected/privileges.out | 14 +++++++++
 src/test/regress/sql/privileges.sql      |  9 ++++++
 6 files changed, 82 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index 0404307d3ca..f206e806f43 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.101 2003/11/29 19:51:57 pgsql Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.102 2004/04/26 15:06:48 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -874,6 +874,43 @@ makeaclitem(PG_FUNCTION_ARGS)
 	PG_RETURN_ACLITEM_P(aclitem);
 }
 
+/* give access to internal data within aclitem
+ */
+Datum 
+aclitem_grantee(PG_FUNCTION_ARGS)
+{
+	AclItem * a = PG_GETARG_ACLITEM_P(0);
+	PG_RETURN_INT32(a->ai_grantee);
+}
+
+Datum
+aclitem_grantor(PG_FUNCTION_ARGS)
+{
+	AclItem * a = PG_GETARG_ACLITEM_P(0);
+	PG_RETURN_INT32(a->ai_grantor);
+}
+
+Datum
+aclitem_idtype(PG_FUNCTION_ARGS)
+{
+	AclItem * a = PG_GETARG_ACLITEM_P(0);
+	PG_RETURN_INT32(ACLITEM_GET_IDTYPE(*a));
+}
+
+Datum
+aclitem_privs(PG_FUNCTION_ARGS)
+{
+	AclItem * a = PG_GETARG_ACLITEM_P(0);
+	PG_RETURN_INT32(ACLITEM_GET_PRIVS(*a));
+}
+
+Datum
+aclitem_goptions(PG_FUNCTION_ARGS)
+{
+	AclItem * a = PG_GETARG_ACLITEM_P(0);
+	PG_RETURN_INT32(ACLITEM_GET_GOPTIONS(*a));
+}
+
 static AclMode
 convert_priv_string(text *priv_type_text)
 {
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 50eea65169b..9e1122982ae 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.224 2004/04/23 20:32:19 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.225 2004/04/26 15:06:49 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	200404220
+#define CATALOG_VERSION_NO	200404260
 
 #endif
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index f4998eee572..fa59adcfc81 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.325 2004/04/23 20:32:19 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.326 2004/04/26 15:06:49 momjian Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -3534,6 +3534,18 @@ DESCR("non-persistent series generator");
 DATA(insert OID = 1069 (  generate_series PGNSP PGUID 12 f f t t v 2 20 "20 20" _null_ generate_series_int8 - _null_ ));
 DESCR("non-persistent series generator");
 
+/* aclitem utils */
+DATA(insert OID = 2510 (  aclitem_grantor 			   PGNSP PGUID 12 f f t f i 1 23 "1033" _null_ aclitem_grantor - _null_ ));
+DESCR("extract user id grantor from aclitem");
+DATA(insert OID = 2511 (  aclitem_grantee 			   PGNSP PGUID 12 f f t f i 1 23 "1033" _null_ aclitem_grantee - _null_ ));
+DESCR("extract grantee (user or group id) from aclitem");
+DATA(insert OID = 2512 (  aclitem_idtype 			   PGNSP PGUID 12 f f t f i 1 23 "1033" _null_ aclitem_idtype - _null_ ));
+DESCR("extract id type of grantee (0 public, 1 user, 2 group) from aclitem");
+DATA(insert OID = 2513 (  aclitem_privs 			   PGNSP PGUID 12 f f t f i 1 23 "1033" _null_ aclitem_privs - _null_ ));
+DESCR("extract privileges from aclitem");
+DATA(insert OID = 2514 (  aclitem_goptions 			   PGNSP PGUID 12 f f t f i 1 23 "1033" _null_ aclitem_goptions - _null_ ));
+DESCR("extract grant options from aclitem");
+
 
 /*
  * Symbolic values for provolatile column: these indicate whether the result
diff --git a/src/include/utils/acl.h b/src/include/utils/acl.h
index efe7af30b20..6cd1d7fb7ef 100644
--- a/src/include/utils/acl.h
+++ b/src/include/utils/acl.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/acl.h,v 1.66 2004/01/14 23:01:55 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/utils/acl.h,v 1.67 2004/04/26 15:06:49 momjian Exp $
  *
  * NOTES
  *	  An ACL array is simply an array of AclItems, representing the union
@@ -220,6 +220,11 @@ extern Datum aclcontains(PG_FUNCTION_ARGS);
 extern Datum makeaclitem(PG_FUNCTION_ARGS);
 extern Datum aclitem_eq(PG_FUNCTION_ARGS);
 extern Datum hash_aclitem(PG_FUNCTION_ARGS);
+extern Datum aclitem_grantee(PG_FUNCTION_ARGS);
+extern Datum aclitem_grantor(PG_FUNCTION_ARGS);
+extern Datum aclitem_idtype(PG_FUNCTION_ARGS);
+extern Datum aclitem_privs(PG_FUNCTION_ARGS);
+extern Datum aclitem_goptions(PG_FUNCTION_ARGS);
 
 /*
  * prototypes for functions in aclchk.c
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
index f5a6c039d54..fe1b8483a65 100644
--- a/src/test/regress/expected/privileges.out
+++ b/src/test/regress/expected/privileges.out
@@ -581,6 +581,20 @@ SELECT has_table_privilege('regressuser1', 'atest4', 'SELECT WITH GRANT OPTION')
  t
 (1 row)
 
+-- aclitem utils small test
+SELECT u1.usename AS u1, u2.usename AS u2, 
+  aclitem_idtype(c.relacl[0]) AS idtype, 
+  aclitem_privs(c.relacl[0]) AS privs,
+  aclitem_goptions(c.relacl[0]) AS goptions
+FROM pg_class AS c, pg_user AS u1, pg_user AS u2
+WHERE u1.usesysid = aclitem_grantor(c.relacl[0])
+  AND u2.usesysid = aclitem_grantee(c.relacl[0])
+  AND c.relname LIKE 'atest4';
+      u1      |      u2      | idtype | privs | goptions 
+--------------+--------------+--------+-------+----------
+ regressuser1 | regressuser1 |      1 |   127 |      127
+(1 row)
+
 -- clean up
 \c regression
 DROP FUNCTION testfunc2(int);
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
index d3e9b543035..dd33295277a 100644
--- a/src/test/regress/sql/privileges.sql
+++ b/src/test/regress/sql/privileges.sql
@@ -316,6 +316,15 @@ SELECT has_table_privilege('regressuser3', 'atest4', 'SELECT'); -- false
 
 SELECT has_table_privilege('regressuser1', 'atest4', 'SELECT WITH GRANT OPTION'); -- true
 
+-- aclitem utils small test
+SELECT u1.usename AS u1, u2.usename AS u2, 
+  aclitem_idtype(c.relacl[0]) AS idtype, 
+  aclitem_privs(c.relacl[0]) AS privs,
+  aclitem_goptions(c.relacl[0]) AS goptions
+FROM pg_class AS c, pg_user AS u1, pg_user AS u2
+WHERE u1.usesysid = aclitem_grantor(c.relacl[0])
+  AND u2.usesysid = aclitem_grantee(c.relacl[0])
+  AND c.relname LIKE 'atest4';
 
 -- clean up
 
-- 
GitLab