Create/drop cast now requires ownership of at least one of the types.
This commit is contained in:
parent
014a86ac47
commit
9bccdf17f7
@ -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.
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user