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