OSDN Git Service

Create/drop cast now requires ownership of at least one of the types.
authorPeter Eisentraut <peter_e@gmx.net>
Sun, 11 Aug 2002 17:44:12 +0000 (17:44 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Sun, 11 Aug 2002 17:44:12 +0000 (17:44 +0000)
doc/src/sgml/ref/create_cast.sgml
doc/src/sgml/ref/drop_cast.sgml
src/backend/commands/functioncmds.c

index 8125994..7fd5ba0 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.1 2002/07/18 23:11:27 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.2 2002/08/11 17:44:12 petere Exp $ -->
 
 <refentry id="SQL-CREATECAST">
  <refmeta>
@@ -81,9 +81,8 @@ INSERT INTO foo(f1) VALUES(42);
   </para>
 
   <para>
-   To be able to create a cast, you must own the underlying function.
-   To be able to create a binary compatible cast, you must own both
-   the source and the target data type.
+   To be able to create a cast, you must own the source or the target
+   data type.
   </para>
 
    <variablelist>
@@ -155,11 +154,6 @@ INSERT INTO foo(f1) VALUES(42);
   </para>
 
   <para>
-   The privileges required to create a cast may be changed in a future
-   release.
-  </para>
-
-  <para>
    Remember that if you want to be able to convert types both ways you
    need to declare casts both ways explicitly.
   </para>
index 3715211..2f2cec0 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_cast.sgml,v 1.1 2002/07/18 23:11:27 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_cast.sgml,v 1.2 2002/08/11 17:44:12 petere Exp $ -->
 
 <refentry id="SQL-DROPCAST">
  <refmeta>
@@ -26,10 +26,9 @@ DROP CAST (<replaceable>sourcetype</replaceable> AS <replaceable>targettype</rep
   </para>
 
   <para>
-   To be able to drop a cast, you must own the underlying function.
-   To be able to drop a binary compatible cast, you must own both the
-   source and the target data type.  These are the same privileges
-   that are required to create a cast.
+   To be able to drop a cast, you must own the source or the target
+   data type.  These are the same privileges that are required to
+   create a cast.
   </para>
 
    <variablelist>
@@ -76,11 +75,6 @@ DROP CAST (<replaceable>sourcetype</replaceable> AS <replaceable>targettype</rep
   <para>
    Use <command>CREATE CAST</command> to create user-defined casts.
   </para>
-
-  <para>
-   The privileges required to drop a cast may be changed in a future
-   release.
-  </para>
  </refsect1>
 
 
index 944ae19..51d0036 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.16 2002/08/05 03:29:16 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.17 2002/08/11 17:44:12 petere Exp $
  *
  * DESCRIPTION
  *       These routines take the parse tree and pick out the
@@ -621,6 +621,12 @@ CreateCast(CreateCastStmt *stmt)
        if (sourcetypeid == targettypeid)
                elog(ERROR, "source data type and target data type are the same");
 
+       if (!pg_type_ownercheck(sourcetypeid, GetUserId())
+               && !pg_type_ownercheck(targettypeid, GetUserId()))
+               elog(ERROR, "must be owner of type %s or type %s",
+                        TypeNameToString(stmt->sourcetype),
+                        TypeNameToString(stmt->targettype));
+
        relation = heap_openr(CastRelationName, RowExclusiveLock);
 
        tuple = SearchSysCache(CASTSOURCETARGET,
@@ -639,10 +645,6 @@ CreateCast(CreateCastStmt *stmt)
                                                                                 false,
                                                                                 "CreateCast");
 
-               if (!pg_proc_ownercheck(funcid, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  NameListToString(stmt->func->funcname));
-
                tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcid), 0, 0, 0);
                if (!HeapTupleIsValid(tuple))
                        elog(ERROR, "cache lookup of function %u failed", funcid);
@@ -666,12 +668,6 @@ CreateCast(CreateCastStmt *stmt)
        else
        {
                /* indicates binary compatibility */
-               if (!pg_type_ownercheck(sourcetypeid, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  TypeNameToString(stmt->sourcetype));
-               if (!pg_type_ownercheck(targettypeid, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  TypeNameToString(stmt->targettype));
                funcid = InvalidOid;
        }
 
@@ -730,7 +726,6 @@ DropCast(DropCastStmt *stmt)
        Oid                     sourcetypeid;
        Oid                     targettypeid;
        HeapTuple       tuple;
-       Form_pg_cast caststruct;
        ObjectAddress object;
 
        sourcetypeid = LookupTypeName(stmt->sourcetype);
@@ -753,22 +748,11 @@ DropCast(DropCastStmt *stmt)
                         TypeNameToString(stmt->targettype));
 
        /* Permission check */
-       caststruct = (Form_pg_cast) GETSTRUCT(tuple);
-       if (caststruct->castfunc != InvalidOid)
-       {
-               if (!pg_proc_ownercheck(caststruct->castfunc, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  get_func_name(caststruct->castfunc));
-       }
-       else
-       {
-               if (!pg_type_ownercheck(sourcetypeid, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  format_type_be(sourcetypeid));
-               if (!pg_type_ownercheck(targettypeid, GetUserId()))
-                       aclcheck_error(ACLCHECK_NOT_OWNER,
-                                                  format_type_be(targettypeid));
-       }
+       if (!pg_type_ownercheck(sourcetypeid, GetUserId())
+               && !pg_type_ownercheck(targettypeid, GetUserId()))
+               elog(ERROR, "must be owner of type %s or type %s",
+                        TypeNameToString(stmt->sourcetype),
+                        TypeNameToString(stmt->targettype));
 
        /*
         * Do the deletion