diff --git a/doc/src/sgml/ref/create_cast.sgml b/doc/src/sgml/ref/create_cast.sgml
index 81259949f1e6483cd8d96a3eba3caba1f03e9330..7fd5ba0d47041fbd3ddcc2e55907b4bcfdbe1e58 100644
--- a/doc/src/sgml/ref/create_cast.sgml
+++ b/doc/src/sgml/ref/create_cast.sgml
@@ -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>
@@ -154,11 +153,6 @@ INSERT INTO foo(f1) VALUES(42);
    Use <command>DROP CAST</command> to remove user-defined casts.
   </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.
diff --git a/doc/src/sgml/ref/drop_cast.sgml b/doc/src/sgml/ref/drop_cast.sgml
index 37152114bcaeae44c2fefdd14d8b2b5f0aec6e40..2f2cec02e14628ace86ea31972897a4264e33a60 100644
--- a/doc/src/sgml/ref/drop_cast.sgml
+++ b/doc/src/sgml/ref/drop_cast.sgml
@@ -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>
 
 
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 944ae192a0debbf310a74a13924c784c59561b9a..51d003600bbcb517900477ae913bacb0ab4f609c 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -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