Create/drop cast now requires ownership of at least one of the types.

This commit is contained in:
Peter Eisentraut 2002-08-11 17:44:12 +00:00
parent 014a86ac47
commit 9bccdf17f7
3 changed files with 19 additions and 47 deletions

View 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"> <refentry id="SQL-CREATECAST">
<refmeta> <refmeta>
@ -81,9 +81,8 @@ INSERT INTO foo(f1) VALUES(42);
</para> </para>
<para> <para>
To be able to create a cast, you must own the underlying function. To be able to create a cast, you must own the source or the target
To be able to create a binary compatible cast, you must own both data type.
the source and the target data type.
</para> </para>
<variablelist> <variablelist>
@ -154,11 +153,6 @@ INSERT INTO foo(f1) VALUES(42);
Use <command>DROP CAST</command> to remove user-defined casts. Use <command>DROP CAST</command> to remove user-defined casts.
</para> </para>
<para>
The privileges required to create a cast may be changed in a future
release.
</para>
<para> <para>
Remember that if you want to be able to convert types both ways you Remember that if you want to be able to convert types both ways you
need to declare casts both ways explicitly. need to declare casts both ways explicitly.

View 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"> <refentry id="SQL-DROPCAST">
<refmeta> <refmeta>
@ -26,10 +26,9 @@ DROP CAST (<replaceable>sourcetype</replaceable> AS <replaceable>targettype</rep
</para> </para>
<para> <para>
To be able to drop a cast, you must own the underlying function. To be able to drop a cast, you must own the source or the target
To be able to drop a binary compatible cast, you must own both the data type. These are the same privileges that are required to
source and the target data type. These are the same privileges create a cast.
that are required to create a cast.
</para> </para>
<variablelist> <variablelist>
@ -76,11 +75,6 @@ DROP CAST (<replaceable>sourcetype</replaceable> AS <replaceable>targettype</rep
<para> <para>
Use <command>CREATE CAST</command> to create user-defined casts. Use <command>CREATE CAST</command> to create user-defined casts.
</para> </para>
<para>
The privileges required to drop a cast may be changed in a future
release.
</para>
</refsect1> </refsect1>

View File

@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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 * DESCRIPTION
* These routines take the parse tree and pick out the * These routines take the parse tree and pick out the
@ -621,6 +621,12 @@ CreateCast(CreateCastStmt *stmt)
if (sourcetypeid == targettypeid) if (sourcetypeid == targettypeid)
elog(ERROR, "source data type and target data type are the same"); 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); relation = heap_openr(CastRelationName, RowExclusiveLock);
tuple = SearchSysCache(CASTSOURCETARGET, tuple = SearchSysCache(CASTSOURCETARGET,
@ -639,10 +645,6 @@ CreateCast(CreateCastStmt *stmt)
false, false,
"CreateCast"); "CreateCast");
if (!pg_proc_ownercheck(funcid, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER,
NameListToString(stmt->func->funcname));
tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcid), 0, 0, 0); tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcid), 0, 0, 0);
if (!HeapTupleIsValid(tuple)) if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup of function %u failed", funcid); elog(ERROR, "cache lookup of function %u failed", funcid);
@ -666,12 +668,6 @@ CreateCast(CreateCastStmt *stmt)
else else
{ {
/* indicates binary compatibility */ /* 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; funcid = InvalidOid;
} }
@ -730,7 +726,6 @@ DropCast(DropCastStmt *stmt)
Oid sourcetypeid; Oid sourcetypeid;
Oid targettypeid; Oid targettypeid;
HeapTuple tuple; HeapTuple tuple;
Form_pg_cast caststruct;
ObjectAddress object; ObjectAddress object;
sourcetypeid = LookupTypeName(stmt->sourcetype); sourcetypeid = LookupTypeName(stmt->sourcetype);
@ -753,22 +748,11 @@ DropCast(DropCastStmt *stmt)
TypeNameToString(stmt->targettype)); TypeNameToString(stmt->targettype));
/* Permission check */ /* Permission check */
caststruct = (Form_pg_cast) GETSTRUCT(tuple); if (!pg_type_ownercheck(sourcetypeid, GetUserId())
if (caststruct->castfunc != InvalidOid) && !pg_type_ownercheck(targettypeid, GetUserId()))
{ elog(ERROR, "must be owner of type %s or type %s",
if (!pg_proc_ownercheck(caststruct->castfunc, GetUserId())) TypeNameToString(stmt->sourcetype),
aclcheck_error(ACLCHECK_NOT_OWNER, TypeNameToString(stmt->targettype));
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));
}
/* /*
* Do the deletion * Do the deletion