Create/drop cast now requires ownership of at least one of the types.
authorPeter Eisentraut
Sun, 11 Aug 2002 17:44:12 +0000 (17:44 +0000)
committerPeter Eisentraut
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 81259949f1e6483cd8d96a3eba3caba1f03e9330..7fd5ba0d47041fbd3ddcc2e55907b4bcfdbe1e58 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  
@@ -81,9 +81,8 @@ INSERT INTO foo(f1) VALUES(42);
   
 
   
-   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.
   
 
    
@@ -154,11 +153,6 @@ INSERT INTO foo(f1) VALUES(42);
    Use DROP CAST to remove user-defined casts.
   
 
-  
-   The privileges required to create a cast may be changed in a future
-   release.
-  
-
   
    Remember that if you want to be able to convert types both ways you
    need to declare casts both ways explicitly.
index 37152114bcaeae44c2fefdd14d8b2b5f0aec6e40..2f2cec02e14628ace86ea31972897a4264e33a60 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  
@@ -26,10 +26,9 @@ DROP CAST (sourcetype AS targettype
   
 
   
-   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.
   
 
    
@@ -76,11 +75,6 @@ DROP CAST (sourcetype AS targettype
   
    Use CREATE CAST to create user-defined casts.
   
-
-  
-   The privileges required to drop a cast may be changed in a future
-   release.
-  
  
 
 
index 944ae192a0debbf310a74a13924c784c59561b9a..51d003600bbcb517900477ae913bacb0ab4f609c 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