mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-18 18:44:06 +08:00
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">
|
||||
<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.
|
||||
|
@ -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>
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user