OSDN Git Service

Reduce the permissions check needed to use pgrowlocks() to having
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Aug 2007 22:59:30 +0000 (22:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Aug 2007 22:59:30 +0000 (22:59 +0000)
SELECT on the target table.  Per discussion.

contrib/pgrowlocks/pgrowlocks.c

index 73dea0c..aaa132f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $PostgreSQL: pgsql/contrib/pgrowlocks/pgrowlocks.c,v 1.6 2007/08/27 00:13:51 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/pgrowlocks/pgrowlocks.c,v 1.7 2007/08/28 22:59:30 tgl Exp $
  *
  * Copyright (c) 2005-2006     Tatsuo Ishii
  *
@@ -31,6 +31,7 @@
 #include "funcapi.h"
 #include "miscadmin.h"
 #include "storage/procarray.h"
+#include "utils/acl.h"
 #include "utils/builtins.h"
 
 
@@ -67,16 +68,12 @@ pgrowlocks(PG_FUNCTION_ARGS)
        MyData     *mydata;
        Relation        rel;
 
-       if (!superuser())
-               ereport(ERROR,
-                               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                                (errmsg("must be superuser to use pgrowlocks"))));
-
        if (SRF_IS_FIRSTCALL())
        {
                text       *relname;
                RangeVar   *relrv;
                MemoryContext oldcontext;
+               AclResult       aclresult;
 
                funcctx = SRF_FIRSTCALL_INIT();
                oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
@@ -92,6 +89,13 @@ pgrowlocks(PG_FUNCTION_ARGS)
                relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
                rel = heap_openrv(relrv, AccessShareLock);
 
+               /* check permissions: must have SELECT on table */
+               aclresult = pg_class_aclcheck(RelationGetRelid(rel), GetUserId(),
+                                                                         ACL_SELECT);
+               if (aclresult != ACLCHECK_OK)
+                       aclcheck_error(aclresult, ACL_KIND_CLASS,
+                                                  RelationGetRelationName(rel));
+
                scan = heap_beginscan(rel, SnapshotNow, 0, NULL);
                mydata = palloc(sizeof(*mydata));
                mydata->rel = rel;